验证是否错误

master
linbin 2024-09-12 23:04:08 +08:00
parent 5148e6544c
commit c97e6603ff
7 changed files with 75 additions and 17 deletions

View File

@ -40,6 +40,8 @@ public interface JfireSE
ClassInfo find(int classId);
Object readByUnderInstanceIdFlag(ByteArray byteArray, byte flag);
Object readByNameIdContent(ByteArray byteArray, boolean refTracking);
Object readByIdInstanceId(ByteArray byteArray);

View File

@ -173,6 +173,42 @@ public class JfireSEImpl implements JfireSE
return deSerializedClassInfos[classId];
}
@Override
public Object readByUnderInstanceIdFlag(ByteArray byteArray, byte flag)
{
switch (flag)
{
case JfireSE.NAME_ID_CONTENT_TRACK ->
{
byte[] classNameBytes = byteArray.readBytesWithSizeEmbedded();
int classId = byteArray.readPositiveVarInt();
ClassInfo classInfo = find(classNameBytes, classId);
return refTracking ? classInfo.readWithTrack(byteArray) : classInfo.readWithoutTrack(byteArray);
}
case JfireSE.NAME_ID_CONTENT_UN_TRACK ->
{
byte[] classNameBytes = byteArray.readBytesWithSizeEmbedded();
int classId = byteArray.readPositiveVarInt();
return find(classNameBytes, classId).readWithoutTrack(byteArray);
}
case JfireSE.ID_INSTANCE_ID ->
{
return find(byteArray.readPositiveVarInt()).getInstanceById(byteArray.readPositiveVarInt());
}
case JfireSE.ID_CONTENT_TRACK ->
{
int classId = byteArray.readPositiveVarInt();
return find(classId).readWithTrack(byteArray);
}
case JfireSE.ID_CONTENT_UN_TRACK ->
{
int classId = byteArray.readPositiveVarInt();
return find(classId).readWithoutTrack(byteArray);
}
default -> throw new RuntimeException("未知的序列化类型");
}
}
@Override
public Object readByNameIdContent(ByteArray byteArray, boolean refTracking)
{

View File

@ -1,9 +1,9 @@
package com.jfirer.se2.serializer;
import com.jfirer.se2.JfireSE;
import com.jfirer.se2.JfireSEImpl;
import com.jfirer.se2.serializer.impl.ArraySerializer;
import com.jfirer.se2.serializer.impl.BoxedArraySerializer;
import com.jfirer.se2.serializer.impl.BoxedTypeSerializer;
import com.jfirer.se2.serializer.impl.ObjectSerializer.ObjectSerializer;
import com.jfirer.se2.serializer.impl.PrimitiveArraySerializer;
@ -35,6 +35,7 @@ public class SerializerFactory
store.put(Double[].class, new BoxedArraySerializer.DoubleArraySerializer());
store.put(Float[].class, new BoxedArraySerializer.FloatArraySerializer());
store.put(String[].class, new BoxedArraySerializer.StringArraySerializer());
store.put(String.class, new BoxedTypeSerializer.StringSerializer());
}
public Serializer getSerializer(Class<?> clazz)

View File

@ -8,6 +8,8 @@ import com.jfirer.se2.serializer.Serializer;
import java.lang.reflect.Array;
import static com.jfirer.se2.JfireSE.*;
public class ArraySerializer<T> implements Serializer
{
private Class<?> componentType;
@ -68,11 +70,8 @@ public class ArraySerializer<T> implements Serializer
{
switch (flag)
{
case JfireSE.NAME_ID_CONTENT_TRACK -> arr[i] = (T) jfireSE.readByNameIdContent(byteArray, true);
case JfireSE.NAME_ID_CONTENT_UN_TRACK -> arr[i] = (T) jfireSE.readByNameIdContent(byteArray, false);
case JfireSE.ID_INSTANCE_ID -> arr[i] = (T) jfireSE.readByIdInstanceId(byteArray);
case JfireSE.ID_CONTENT_TRACK -> arr[i] = (T) jfireSE.readByIdContent(byteArray, true);
case JfireSE.ID_CONTENT_UN_TRACK -> arr[i] = (T) jfireSE.readByIdContent(byteArray, false);
case NAME_ID_CONTENT_TRACK, NAME_ID_CONTENT_UN_TRACK, ID_INSTANCE_ID, ID_CONTENT_TRACK,
ID_CONTENT_UN_TRACK -> arr[i] = (T) jfireSE.readByUnderInstanceIdFlag(byteArray, flag);
case JfireSE.INSTANCE_ID -> arr[i] = (T) typeDefinedClassInfo.getInstanceById(byteArray.readPositiveVarInt());
case JfireSE.CONTENT_TRACK -> arr[i] = (T) typeDefinedClassInfo.readWithTrack(byteArray);
case JfireSE.CONTENT_UN_TRACK -> arr[i] = (T) typeDefinedClassInfo.readWithoutTrack(byteArray);

View File

@ -0,0 +1,28 @@
package com.jfirer.se2.serializer.impl;
import com.jfirer.se2.ByteArray;
import com.jfirer.se2.classinfo.RefTracking;
import com.jfirer.se2.serializer.Serializer;
public abstract class BoxedTypeSerializer implements Serializer
{
public static class StringSerializer extends BoxedTypeSerializer
{
@Override
public void writeBytes(ByteArray byteArray, Object instance)
{
byteArray.writeString((String) instance);
}
@Override
public Object read(ByteArray byteArray, RefTracking refTracking)
{
String s = byteArray.readString();
if (refTracking != null)
{
refTracking.addTracking(s);
}
return s;
}
}
}

View File

@ -471,15 +471,11 @@ public class ObjectSerializer implements Serializer
readBody.append("else{\r\n");
readBody.append("switch(" + flagName + "){\r\n");
readBody.append("""
case JfireSE.NAME_ID_CONTENT_TRACK-> UNSAFE.putReference(instance,offset, jfireSE.readByNameIdContent(byteArray, true));
case JfireSE.NAME_ID_CONTENT_UN_TRACK->UNSAFE.putReference(instance,offset, jfireSE.readByNameIdContent(byteArray, false));
case JfireSE.ID_INSTANCE_ID->UNSAFE.putReference(instance,offset, jfireSE.readByIdInstanceId(byteArray));
case JfireSE.ID_CONTENT_TRACK->UNSAFE.putReference(instance,offset, jfireSE.readByIdContent(byteArray, true));
case JfireSE.ID_CONTENT_UN_TRACK-> UNSAFE.putReference(instance,offset, jfireSE.readByIdContent(byteArray, false));
case JfireSE.NAME_ID_CONTENT_TRACK,JfireSE.NAME_ID_CONTENT_UN_TRACK,JfireSE.ID_INSTANCE_ID,JfireSE.ID_CONTENT_TRACK,JfireSE.ID_CONTENT_UN_TRACK-> UNSAFE.putReference(instance,offset, jfireSE.readByUnderInstanceIdFlag(byteArray, flag));
case JfireSE.INSTANCE_ID -> UNSAFE.putReference(instance,offset, firstClassInfo.getInstanceById(byteArray.readPositiveVarInt()));
case JfireSE.CONTENT_TRACK -> UNSAFE.putReference(instance,offset, firstClassInfo.readWithTrack(byteArray));
case JfireSE.CONTENT_UN_TRACK -> UNSAFE.putReference(instance,offset, firstClassInfo.readWithoutTrack(byteArray));
""".replace("offset", String.valueOf(l)) .replace("firstClassInfo", firstClassInfoProperty));
""".replace("offset", String.valueOf(l)).replace("firstClassInfo", firstClassInfoProperty).replace("flag", flagName));
readBody.append("default -> throw new RuntimeException(\"flag:\" + " + flagName + ");\r\n");
readBody.append("}\r\n");
readBody.append("}\r\n");

View File

@ -76,11 +76,7 @@ public class VariableFieldInfo extends FieldInfo
{
switch (flag)
{
case JfireSE.NAME_ID_CONTENT_TRACK -> accessor.setObject(instance, jfireSE.readByNameIdContent(byteArray, true));
case JfireSE.NAME_ID_CONTENT_UN_TRACK -> accessor.setObject(instance, jfireSE.readByNameIdContent(byteArray, false));
case JfireSE.ID_INSTANCE_ID -> accessor.setObject(instance, jfireSE.readByIdInstanceId(byteArray));
case JfireSE.ID_CONTENT_TRACK -> accessor.setObject(instance, jfireSE.readByIdContent(byteArray, true));
case JfireSE.ID_CONTENT_UN_TRACK -> accessor.setObject(instance, jfireSE.readByIdContent(byteArray, false));
case JfireSE.NAME_ID_CONTENT_TRACK,JfireSE.NAME_ID_CONTENT_UN_TRACK, JfireSE.ID_INSTANCE_ID,JfireSE.ID_CONTENT_TRACK,JfireSE.ID_CONTENT_UN_TRACK -> accessor.setObject(instance, jfireSE.readByUnderInstanceIdFlag(byteArray, flag));
case JfireSE.INSTANCE_ID -> accessor.setObject(instance, firstClassInfo.getInstanceById(byteArray.readPositiveVarInt()));
case JfireSE.CONTENT_TRACK -> accessor.setObject(instance, firstClassInfo.readWithTrack(byteArray));
case JfireSE.CONTENT_UN_TRACK -> accessor.setObject(instance, firstClassInfo.readWithoutTrack(byteArray));