diff --git a/pom.xml b/pom.xml
index 785d51b..f1a40a6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,6 +56,12 @@
0.7.1
test
+
+ com.esotericsoftware
+ kryo
+ 3.0.2
+ test
+
org.openjdk.jmh
jmh-core
@@ -68,6 +74,24 @@
1.37
test
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.2
+ test
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ 2.2
+ test
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+ test
+
diff --git a/src/main/java/com/jfirer/se2/JfireSEConfig.java b/src/main/java/com/jfirer/se2/JfireSEConfig.java
index ea46602..eed68ee 100644
--- a/src/main/java/com/jfirer/se2/JfireSEConfig.java
+++ b/src/main/java/com/jfirer/se2/JfireSEConfig.java
@@ -90,6 +90,7 @@ public class JfireSEConfig
staticRegisterClass(ConcurrentSkipListSet.class);
staticRegisterClass(Date.class);
staticRegisterClass(java.sql.Date.class);
+ staticRegisterClass(Calendar.getInstance().getClass());
}
public JfireSEConfig refTracking()
diff --git a/src/main/java/com/jfirer/se2/JfireSEImpl.java b/src/main/java/com/jfirer/se2/JfireSEImpl.java
index 1b748c0..46a55e9 100644
--- a/src/main/java/com/jfirer/se2/JfireSEImpl.java
+++ b/src/main/java/com/jfirer/se2/JfireSEImpl.java
@@ -23,18 +23,15 @@ public class JfireSEImpl implements JfireSE
* 用于存储逆序列化过程中的临时信息
*/
private ClassInfo[] deSerializedClassInfos;
- private ByteArray byteArray = new ByteArray(1000);
+ private ByteArray byteArray = new ByteArray(1000);
private ClassInfo classInfoCache;
- private Map, ClassInfo> classInfoMap = new HashMap<>();
- private SerializerFactory serializerFactory = new SerializerFactory(this);
- private Map classInfoCacheMap = new HashMap<>();
+ private Map, ClassInfo> classInfoMap = new HashMap<>();
+ private SerializerFactory serializerFactory = new SerializerFactory(this);
+ private Map classInfoCacheMap = new HashMap<>();
+ private Map> classNameBytesCache = new HashMap<>();
public JfireSEImpl(boolean refTracking, StaticClasInfo[] staticClasInfos)
{
- for (StaticClasInfo each : staticClasInfos)
- {
- each.setSerializer(serializerFactory.getSerializer(each.getClazz()));
- }
this.refTracking = refTracking;
this.staticClassId = staticClasInfos.length - 1;
serializedClassInfos = new ClassInfo[staticClasInfos.length * 2];
@@ -42,6 +39,10 @@ public class JfireSEImpl implements JfireSE
System.arraycopy(staticClasInfos, 0, serializedClassInfos, 0, staticClasInfos.length);
System.arraycopy(staticClasInfos, 0, deSerializedClassInfos, 0, staticClasInfos.length);
dynamicClassId = staticClassId + 1;
+ for (StaticClasInfo each : staticClasInfos)
+ {
+ each.setSerializer(serializerFactory.getSerializer(each.getClazz()));
+ }
}
@Override
@@ -141,34 +142,36 @@ public class JfireSEImpl implements JfireSE
@Override
public ClassInfo find(byte[] classNameBytes, int classId)
{
- try
+ Class> clazz = classNameBytesCache.computeIfAbsent(classNameBytes, bytes -> {
+ try
+ {
+ return Class.forName(new String(classNameBytes, StandardCharsets.UTF_8));
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException(e);
+ }
+ });
+ ClassInfo classInfo = getOrCreateClassInfo(clazz);
+ if (deSerializedClassInfos == null)
{
- Class> clazz = Class.forName(new String(classNameBytes, StandardCharsets.UTF_8));
- ClassInfo classInfo = getOrCreateClassInfo(clazz);
- if (deSerializedClassInfos == null)
- {
- deSerializedClassInfos = new ClassInfo[classId + 1];
- deSerializedClassInfos[classId] = classInfo;
- }
- else if (classId >= deSerializedClassInfos.length)
- {
- int newLen = deSerializedClassInfos.length * 2;
- newLen = newLen > classId ? newLen : classId + 1;
- ClassInfo[] tmp = new ClassInfo[newLen];
- System.arraycopy(deSerializedClassInfos, 0, tmp, 0, deSerializedClassInfos.length);
- deSerializedClassInfos = tmp;
- deSerializedClassInfos[classId] = classInfo;
- }
- else
- {
- deSerializedClassInfos[classId] = classInfo;
- }
- return classInfo;
+ deSerializedClassInfos = new ClassInfo[classId + 1];
+ deSerializedClassInfos[classId] = classInfo;
}
- catch (ClassNotFoundException e)
+ else if (classId >= deSerializedClassInfos.length)
{
- throw new RuntimeException(e);
+ int newLen = deSerializedClassInfos.length * 2;
+ newLen = newLen > classId ? newLen : classId + 1;
+ ClassInfo[] tmp = new ClassInfo[newLen];
+ System.arraycopy(deSerializedClassInfos, 0, tmp, 0, deSerializedClassInfos.length);
+ deSerializedClassInfos = tmp;
+ deSerializedClassInfos[classId] = classInfo;
}
+ else
+ {
+ deSerializedClassInfos[classId] = classInfo;
+ }
+ return classInfo;
}
@Override
diff --git a/src/main/java/com/jfirer/se2/classinfo/DynamicClassInfo.java b/src/main/java/com/jfirer/se2/classinfo/DynamicClassInfo.java
index d2825c0..da4c8a6 100644
--- a/src/main/java/com/jfirer/se2/classinfo/DynamicClassInfo.java
+++ b/src/main/java/com/jfirer/se2/classinfo/DynamicClassInfo.java
@@ -35,7 +35,7 @@ public class DynamicClassInfo extends ClassInfo
{
if (firstSerialized)
{
- firstSerialized = true;
+ firstSerialized = false;
addTracking(instance);
byteArray.put(JfireSE.NAME_ID_CONTENT_TRACK);
byteArray.writeBytesWithSizeEmbedded(classNameBytes);
@@ -63,7 +63,7 @@ public class DynamicClassInfo extends ClassInfo
{
if (firstSerialized)
{
- firstSerialized = true;
+ firstSerialized = false;
byteArray.put(JfireSE.NAME_ID_CONTENT_UN_TRACK);
byteArray.writeBytesWithSizeEmbedded(classNameBytes);
byteArray.writePositiveVarInt(classId);
diff --git a/src/main/java/com/jfirer/se2/serializer/Serializer.java b/src/main/java/com/jfirer/se2/serializer/Serializer.java
index a4166c5..f06b8f5 100644
--- a/src/main/java/com/jfirer/se2/serializer/Serializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/Serializer.java
@@ -22,4 +22,9 @@ public interface Serializer
* @return
*/
Object read(ByteArray byteArray, RefTracking refTracking);
+
+ default void init()
+ {
+ //为了 ObjectSerializer 和 ArraySerializer 需要初始化的类提供。
+ }
}
diff --git a/src/main/java/com/jfirer/se2/serializer/SerializerFactory.java b/src/main/java/com/jfirer/se2/serializer/SerializerFactory.java
index d4fcf61..a5a1056 100644
--- a/src/main/java/com/jfirer/se2/serializer/SerializerFactory.java
+++ b/src/main/java/com/jfirer/se2/serializer/SerializerFactory.java
@@ -3,7 +3,9 @@ package com.jfirer.se2.serializer;
import com.jfirer.se2.JfireSE;
import com.jfirer.se2.serializer.impl.*;
import com.jfirer.se2.serializer.impl.ObjectSerializer.ObjectSerializer;
+import com.jfirer.se2.serializer.impl.jdk.*;
+import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;
@@ -54,17 +56,34 @@ public class SerializerFactory
store.put(LinkedHashSet.class, new SetSerializer(LinkedHashSet.class, jfireSE));
store.put(Date.class, new DateSerializer());
store.put(java.sql.Date.class, new SqlDateSerializer());
+ store.put(Calendar.getInstance().getClass(), new CalendarSerializer());
+ store.put(Method.class, new MethodSerializer());
+ store.put(Class.class, new ClassSerializer());
}
public Serializer getSerializer(Class> clazz)
{
- if (clazz.isArray())
+ Serializer match = store.get(clazz);
+ if (match != null)
{
- return store.computeIfAbsent(clazz, key -> new ArraySerializer(key, jfireSE));
+ return match;
}
else
{
- return store.computeIfAbsent(clazz, key -> ObjectSerializer.buildCompileVersion(key, jfireSE));
+ if (clazz.isArray())
+ {
+ ArraySerializer arraySerializer = new ArraySerializer(clazz, jfireSE);
+ store.putIfAbsent(clazz, arraySerializer);
+ arraySerializer.init();
+ return arraySerializer;
+ }
+ else
+ {
+ Serializer serializer = ObjectSerializer.buildCompileVersion(clazz, jfireSE);
+ store.putIfAbsent(clazz, serializer);
+ serializer.init();
+ return serializer;
+ }
}
}
}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/ArraySerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/ArraySerializer.java
index d6d0c1f..52ce771 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/ArraySerializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/ArraySerializer.java
@@ -13,13 +13,18 @@ import static com.jfirer.se2.JfireSE.*;
public class ArraySerializer implements Serializer
{
private final Class> componentType;
- private final ClassInfo typeDefinedClassInfo;
+ private ClassInfo typeDefinedClassInfo;
private final JfireSE jfireSE;
public ArraySerializer(Class> clazz, JfireSE jfireSE)
{
- this.jfireSE = jfireSE;
- this.componentType = clazz.getComponentType();
+ this.jfireSE = jfireSE;
+ this.componentType = clazz.getComponentType();
+ }
+
+ @Override
+ public void init()
+ {
typeDefinedClassInfo = jfireSE.getOrCreateClassInfo(componentType);
}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FieldInfo.java b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FieldInfo.java
index 86d19c1..abb0164 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FieldInfo.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FieldInfo.java
@@ -26,4 +26,8 @@ public abstract class FieldInfo
public abstract void write(ByteArray byteArray, Object instance);
public abstract void read(ByteArray byteArray, Object instance);
+
+ public void init()
+ {
+ }
}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FinalFieldInfo.java b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FinalFieldInfo.java
index a9109f1..cd470bd 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FinalFieldInfo.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/FinalFieldInfo.java
@@ -8,16 +8,21 @@ import java.lang.reflect.Field;
public class FinalFieldInfo extends FieldInfo
{
- private ClassInfo classInfo;
- private JfireSE jfireSE;
+ private ClassInfo classInfo;
+ private JfireSE jfireSE;
public FinalFieldInfo(Field field, JfireSE jfireSE)
{
super(field);
- classInfo = jfireSE.getOrCreateClassInfo(field.getType());
this.jfireSE = jfireSE;
}
+ @Override
+ public void init()
+ {
+ classInfo = jfireSE.getOrCreateClassInfo(field.getType());
+ }
+
@Override
public void write(ByteArray byteArray, Object instance)
{
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/ObjectSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/ObjectSerializer.java
index 505863b..ee62a66 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/ObjectSerializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/ObjectSerializer.java
@@ -28,12 +28,21 @@ public class ObjectSerializer implements Serializer
private static int COMPILE_COUNT = 1;
private static final Unsafe UNSAFE = Unsafe.getUnsafe();
- public ObjectSerializer(Class> clazz, JfireSEImpl jfireSE)
+ private ObjectSerializer(Class> clazz, JfireSE jfireSE)
{
fieldInfos = parse(clazz, jfireSE).toArray(FieldInfo[]::new);
this.clazz = clazz;
}
+ @Override
+ public void init()
+ {
+ for (FieldInfo each : fieldInfos)
+ {
+ each.init();
+ }
+ }
+
@Override
public void writeBytes(ByteArray byteArray, Object instance)
{
@@ -67,45 +76,58 @@ public class ObjectSerializer implements Serializer
public static List parse(Class> clazz, JfireSE jfireSE)
{
- Class type = clazz;
+ Class type = clazz;
List fields = new ArrayList<>();
while (type != Object.class)
{
- fields.addAll(Arrays.stream(type.getDeclaredFields()).filter(Predicate.not(field -> Modifier.isStatic(field.getModifiers()))).toList());
+ fields.addAll(Arrays.stream(type.getDeclaredFields()).filter(Predicate.not(field -> Modifier.isStatic(field.getModifiers())))//
+ .filter(field -> !Modifier.isTransient(field.getModifiers()))//
+ .toList());
type = type.getSuperclass();
}
- List primitiveFieldInfos = fields.stream().filter(field -> field.getType().isPrimitive())//
- .sorted(Comparator.comparing(o -> o.getType().getName()))//
- .map(PrimitiveFieldInfo::new)//
- .toList();
- List boxedFieldInfos = fields.stream().filter(field -> ReflectUtil.isPrimitiveBox(field.getType()) || field.getType() == String.class)//
- .sorted(Comparator.comparing(o -> o.getType().getName()))//
- .map(BoxedFieldInfo::new)//
- .toList();
- List finalFieldInfos = fields.stream().filter(Predicate.not(field -> ReflectUtil.isPrimitiveBox(field.getType())))//
- .filter(Predicate.not(field -> ReflectUtil.isPrimitive(field.getType())))//
- .filter(field -> field.getType() != String.class)//
- .filter(field -> field.getType() != void.class && field.getType() != Void.class)//
- .filter(field -> Modifier.isFinal(field.getType().getModifiers()))//
- .sorted(Comparator.comparing(o -> o.getType().getName()))//
- .map(field -> new FinalFieldInfo(field, jfireSE))//
- .toList();
- List variableFieldInfos = fields.stream().filter(Predicate.not(field -> ReflectUtil.isPrimitiveBox(field.getType())))//
- .filter(Predicate.not(field -> ReflectUtil.isPrimitive(field.getType())))//
- .filter(field -> field.getType() != String.class)//
- .filter(field -> field.getType() != void.class && field.getType() != Void.class)//
- .filter(field -> !Modifier.isFinal(field.getType().getModifiers()))//
- .sorted(Comparator.comparing(o -> o.getType().getName()))//
- .map(field -> new VariableFieldInfo(field, jfireSE))//
- .toList();
+ List primitiveFieldInfos = new LinkedList<>();
+ List boxedFieldInfos = new LinkedList<>();
+ List variableFieldInfos = new LinkedList<>();
+ List finalFieldInfos = new LinkedList<>();
+ List unknowObjectFieldInfos = new LinkedList<>();
+ for (Field each : fields)
+ {
+ if (each.getType().isPrimitive())
+ {
+ primitiveFieldInfos.add(new PrimitiveFieldInfo(each));
+ }
+ else if (ReflectUtil.isPrimitiveBox(each.getType()) || each.getType() == String.class)
+ {
+ boxedFieldInfos.add(new BoxedFieldInfo(each));
+ }
+ else if (each.getType() == Object.class || each.getType().isInterface())
+ {
+ unknowObjectFieldInfos.add(new UnknowObjectFieldInfo(each, jfireSE));
+ }
+ else if (Modifier.isFinal(each.getType().getModifiers()))
+ {
+ finalFieldInfos.add(new FinalFieldInfo(each, jfireSE));
+ }
+ else
+ {
+ variableFieldInfos.add(new VariableFieldInfo(each, jfireSE));
+ }
+ }
List list = new LinkedList<>();
list.addAll(primitiveFieldInfos);
list.addAll(boxedFieldInfos);
list.addAll(finalFieldInfos);
list.addAll(variableFieldInfos);
+ list.addAll(unknowObjectFieldInfos);
+ list.sort(Comparator.comparing(o -> o.getField().getType().getName()));
return list;
}
+ public static Serializer buildSlowVersion(Class> clazz, JfireSE jfireSE)
+ {
+ return new ObjectSerializer(clazz, jfireSE);
+ }
+
public static Serializer buildCompileVersion(Class> clazz, JfireSE jfireSE)
{
List parse = parse(clazz, jfireSE);
@@ -131,13 +153,16 @@ public class ObjectSerializer implements Serializer
classModel.addField(new FieldModel("UNSAFE", Unsafe.class, "Unsafe.getUnsafe()", classModel));
classModel.addField(new FieldModel("jfireSE", JfireSE.class, classModel));
classModel.addField(new FieldModel("clazz", Class.class, classModel));
+ classModel.addField(new FieldModel("list_serializer_compile", List.class, classModel));
ConstructorModel constructorModel = new ConstructorModel(classModel);
constructorModel.setParamTypes(Class.class, JfireSE.class, List.class);
constructorModel.setParamNames("clazz", "jfireSE", "list");
- StringBuilder constructorBody = new StringBuilder();
- constructorBody.append("""
- this.jfireSE=jfireSE;
- this.clazz=clazz;""");
+ constructorModel.setBody("""
+ this.jfireSE=jfireSE;
+ this.clazz=clazz;
+ this.list_serializer_compile = list;""");
+ classModel.addConstructor(constructorModel);
+ StringBuilder initBody = new StringBuilder();
try
{
MethodModel writeMethod = new MethodModel(Serializer.class.getDeclaredMethod("writeBytes", ByteArray.class, Object.class), classModel);
@@ -150,7 +175,7 @@ public class ObjectSerializer implements Serializer
for (FieldInfo fieldInfo : parse)
{
long l = UNSAFE.objectFieldOffset(fieldInfo.field);
- if (fieldInfo instanceof PrimitiveFieldInfo primitiveFieldInfo)
+ if (fieldInfo instanceof PrimitiveFieldInfo)
{
switch (fieldInfo.classId)
{
@@ -197,7 +222,7 @@ public class ObjectSerializer implements Serializer
default -> throw new RuntimeException("不支持的类型");
}
}
- else if (fieldInfo instanceof BoxedFieldInfo boxedFieldInfo)
+ else if (fieldInfo instanceof BoxedFieldInfo)
{
switch (fieldInfo.classId)
{
@@ -263,7 +288,7 @@ public class ObjectSerializer implements Serializer
else
{
byteArray.put(JfireSE.NOT_NULL);
- byteArray.writeVarShort(obj);
+ byteArray.writeVarInt(obj);
}
}
""".replace("offset", String.valueOf(l)));
@@ -271,7 +296,7 @@ public class ObjectSerializer implements Serializer
{
if (byteArray.get() == JfireSE.NOT_NULL)
{
- UNSAFE.putReference(instance,offset, byteArray.readVarShort());
+ UNSAFE.putReference(instance,offset, Short.valueOf((short)byteArray.readVarInt()));
}
}
""".replace("offset", String.valueOf(l)));
@@ -365,7 +390,7 @@ public class ObjectSerializer implements Serializer
byteArray.put(JfireSE.NOT_NULL);
byteArray.writeBoolean(obj);
}
- }
+ }
""".replace("offset", String.valueOf(l)));
readBody.append("""
{
@@ -390,7 +415,7 @@ public class ObjectSerializer implements Serializer
byteArray.put(JfireSE.NOT_NULL);
byteArray.writeChar(obj);
}
- }
+ }
""".replace("offset", String.valueOf(l)));
readBody.append("""
{
@@ -415,7 +440,7 @@ public class ObjectSerializer implements Serializer
byteArray.put(JfireSE.NOT_NULL);
byteArray.writeString(obj);
}
- }
+ }
""".replace("offset", String.valueOf(l)));
readBody.append("""
{
@@ -436,47 +461,38 @@ public class ObjectSerializer implements Serializer
FieldModel classInfoModel = new FieldModel(classInfoProperty, ClassInfo.class, classModel);
FieldModel firstClassInfoModel = new FieldModel(firstClassInfoProperty, ClassInfo.class, classModel);
classModel.addField(classInfoModel, firstClassInfoModel);
- constructorBody.append(classInfoProperty + "=jfireSE.getOrCreateClassInfo(((FieldInfo)list.get(" + fieldIndex + ")).getField().getType());\r\n");
- constructorBody.append(" if( ((FieldInfo)list.get(" + fieldIndex + ")).getField().getType().isInterface()) {");
- constructorBody.append(firstClassInfoProperty + "=null;\r\n}");
- constructorBody.append("else{\r\n");
- constructorBody.append(firstClassInfoProperty + "=" + classInfoProperty + ";\r\n}");
+ initBody.append(classInfoProperty).append("=jfireSE.getOrCreateClassInfo(((FieldInfo)list_serializer_compile.get(").append(fieldIndex).append(")).getField().getType());\r\n");
+ initBody.append(" if( ((FieldInfo)list_serializer_compile.get(").append(fieldIndex).append(")).getField().getType().isInterface()) {");
+ initBody.append(firstClassInfoProperty).append("=null;\r\n}");
+ initBody.append("else{\r\n");
+ initBody.append(firstClassInfoProperty).append("=").append(classInfoProperty).append(";\r\n}");
String objName = "obj_" + fieldIndex;
- writeBody.append("Object " + objName + "= UNSAFE.getReference(instance," + l + ");\r\n");
- writeBody.append("if(" + objName + "==null){ byteArray.put(JfireSE.NULL);}\r\n");
+ writeBody.append("Object ").append(objName).append("= UNSAFE.getReference(instance,").append(l).append(");\r\n");
+ writeBody.append("if(").append(objName).append("==null){ byteArray.put(JfireSE.NULL);}\r\n");
writeBody.append("else{\r\n");
String objClassName = "objClass_$_" + fieldIndex;
- writeBody.append("Class " + objClassName + " = " + objName + ".getClass();\r\n");
- writeBody.append("if(" + objClassName + "==" + classInfoProperty + ".getClazz()){");
- writeBody.append("if(" + classInfoProperty + "==" + firstClassInfoProperty + "){\r\n");
- writeBody.append(classInfoProperty + ".writeKnownClazz(byteArray," + objName + ");\r\n");
+ writeBody.append("Class ").append(objClassName).append(" = ").append(objName).append(".getClass();\r\n");
+ writeBody.append("classInfo = classInfo.getClazz() == objClass ? classInfo : jfireSE.getOrCreateClassInfo(objClass);".replace("objClass", objClassName)//
+ .replace("classInfo", classInfoProperty));
+ writeBody.append("if(").append(classInfoProperty).append("==").append(firstClassInfoProperty).append("){\r\n");
+ writeBody.append(classInfoProperty).append(".writeKnownClazz(byteArray,").append(objName).append(");\r\n");
writeBody.append("}\r\n");
writeBody.append("else{\r\n");
- writeBody.append(classInfoProperty + ".write(byteArray," + objName + ");\r\n");
- writeBody.append("}\r\n");
- writeBody.append("}");
- writeBody.append("else{");
- writeBody.append(classInfoProperty + "=" + "jfireSE.getOrCreateClassInfo(" + objClassName + ");\r\n");
- writeBody.append("if(" + classInfoProperty + "==" + firstClassInfoProperty + "){\r\n");
- writeBody.append(classInfoProperty + ".writeKnownClazz(byteArray," + objName + ");\r\n");
- writeBody.append("}\r\n");
- writeBody.append("else{\r\n");
- writeBody.append(classInfoProperty + ".write(byteArray," + objName + ");\r\n");
+ writeBody.append(classInfoProperty).append(".write(byteArray,").append(objName).append(");\r\n");
writeBody.append("}\r\n");
writeBody.append("}\r\n");
- writeBody.append("}");
String flagName = "flag_$_" + fieldIndex;
- readBody.append("byte " + flagName + " = byteArray.get();\r\n");
- readBody.append("if(" + flagName + "==JfireSE.NULL){UNSAFE.putReference(instance," + l + ",null);}\r\n");
+ readBody.append("byte ").append(flagName).append(" = byteArray.get();\r\n");
+ readBody.append("if(").append(flagName).append("==JfireSE.NULL){UNSAFE.putReference(instance,").append(l).append(",null);}\r\n");
readBody.append("else{\r\n");
- readBody.append("switch(" + flagName + "){\r\n");
+ readBody.append("switch(").append(flagName).append("){\r\n");
readBody.append("""
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("flag", flagName));
- readBody.append("default -> throw new RuntimeException(\"flag:\" + " + flagName + ");\r\n");
+ readBody.append("default -> throw new RuntimeException(\"flag:\" + ").append(flagName).append(");\r\n");
readBody.append("}\r\n");
readBody.append("}\r\n");
}
@@ -485,7 +501,7 @@ public class ObjectSerializer implements Serializer
String classInfoProperty = "classInfo_$_" + fieldIndex;
FieldModel classInfoModel = new FieldModel(classInfoProperty, ClassInfo.class, classModel);
classModel.addField(classInfoModel);
- constructorBody.append(classInfoProperty + "=jfireSE.getOrCreateClassInfo(((FieldInfo)list.get(" + fieldIndex + ")).getField().getType());\r\n");
+ initBody.append(classInfoProperty + "=jfireSE.getOrCreateClassInfo(((FieldInfo)list_serializer_compile.get(" + fieldIndex + ")).getField().getType());\r\n");
writeBody.append("""
{
Object obj = UNSAFE.getReference(instance,offset);
@@ -514,15 +530,42 @@ public class ObjectSerializer implements Serializer
case JfireSE.CONTENT_TRACK -> UNSAFE.putReference(instance,offset,classInfo.readWithTrack(byteArray));
case JfireSE.CONTENT_UN_TRACK -> UNSAFE.putReference(instance,offset,classInfo.readWithoutTrack(byteArray));
default -> throw new RuntimeException("flag:" + flag);
- }
+ }
}
}
""".replace("offset", String.valueOf(l)).replace("classInfo", classInfoProperty));
}
+ else if (fieldInfo instanceof UnknowObjectFieldInfo)
+ {
+ writeBody.append("""
+ {
+ Object obj = UNSAFE.getReference(instance,offset);
+ if (obj == null)
+ {
+ byteArray.put(JfireSE.NULL);
+ }
+ else
+ {
+ jfireSE.getOrCreateClassInfo(obj.getClass()).write(byteArray, obj);
+ }
+ }
+ """.replace("offset", String.valueOf(l)));
+ readBody.append("""
+ {
+ byte flag = byteArray.get();
+ if (flag == JfireSE.NULL)
+ {
+ UNSAFE.putReference(instance,offset,null);
+ }
+ else
+ {
+ UNSAFE.putReference(instance, offset,jfireSE.readByUnderInstanceIdFlag(byteArray, flag));
+ }
+ }
+ """.replace("offset", String.valueOf(l)));
+ }
fieldIndex++;
}
- constructorModel.setBody(constructorBody.toString());
- classModel.addConstructor(constructorModel);
writeMethod.setBody(writeBody.toString());
readBody.append("return instance;\r\n");
readMethod.setBody("""
@@ -540,6 +583,9 @@ public class ObjectSerializer implements Serializer
""" + readBody);
classModel.putMethodModel(writeMethod);
classModel.putMethodModel(readMethod);
+ MethodModel initModel = new MethodModel(Serializer.class.getDeclaredMethod("init"), classModel);
+ initModel.setBody(initBody.toString());
+ classModel.putMethodModel(initModel);
CompileHelper compiler = new CompileHelper(Thread.currentThread().getContextClassLoader());
Class> compile = compiler.compile(classModel);
Serializer compiledObjectSerializer = (Serializer) compile.getDeclaredConstructor(Class.class, JfireSE.class, List.class).newInstance(clazz, jfireSE, parse);
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/UnknowObjectFieldInfo.java b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/UnknowObjectFieldInfo.java
new file mode 100644
index 0000000..bb33f21
--- /dev/null
+++ b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/UnknowObjectFieldInfo.java
@@ -0,0 +1,44 @@
+package com.jfirer.se2.serializer.impl.ObjectSerializer;
+
+import com.jfirer.se2.ByteArray;
+import com.jfirer.se2.JfireSE;
+
+import java.lang.reflect.Field;
+
+public class UnknowObjectFieldInfo extends FieldInfo
+{
+ private final JfireSE jfireSE;
+
+ public UnknowObjectFieldInfo(Field field, JfireSE jfireSE)
+ {
+ super(field);
+ this.jfireSE = jfireSE;
+ }
+
+ @Override
+ public void write(ByteArray byteArray, Object instance)
+ {
+ if (instance == null)
+ {
+ byteArray.put(JfireSE.NULL);
+ }
+ else
+ {
+ jfireSE.getOrCreateClassInfo(instance.getClass()).write(byteArray, instance);
+ }
+ }
+
+ @Override
+ public void read(ByteArray byteArray, Object instance)
+ {
+ byte flag = byteArray.get();
+ if (flag == JfireSE.NULL)
+ {
+ accessor.setObject(instance, null);
+ }
+ else
+ {
+ accessor.setObject(instance, jfireSE.readByUnderInstanceIdFlag(byteArray, flag));
+ }
+ }
+}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/VariableFieldInfo.java b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/VariableFieldInfo.java
index bdb2584..ab6f266 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/VariableFieldInfo.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/ObjectSerializer/VariableFieldInfo.java
@@ -10,13 +10,18 @@ public class VariableFieldInfo extends FieldInfo
{
private final JfireSE jfireSE;
private ClassInfo classInfo;
- private final ClassInfo firstClassInfo;
+ private ClassInfo firstClassInfo;
public VariableFieldInfo(Field field, JfireSE jfireSE)
{
super(field);
- classInfo = jfireSE.getOrCreateClassInfo(field.getType());
this.jfireSE = jfireSE;
+ }
+
+ @Override
+ public void init()
+ {
+ classInfo = jfireSE.getOrCreateClassInfo(field.getType());
if (field.getType().isInterface())
{
firstClassInfo = null;
@@ -38,28 +43,14 @@ public class VariableFieldInfo extends FieldInfo
else
{
Class> objClass = obj.getClass();
- if (objClass == classInfo.getClazz())
+ classInfo = classInfo.getClazz() == objClass ? classInfo : jfireSE.getOrCreateClassInfo(objClass);
+ if (classInfo == firstClassInfo)
{
- if (classInfo == firstClassInfo)
- {
- classInfo.writeKnownClazz(byteArray, obj);
- }
- else
- {
- classInfo.write(byteArray, obj);
- }
+ classInfo.writeKnownClazz(byteArray, obj);
}
else
{
- classInfo = jfireSE.getOrCreateClassInfo(objClass);
- if (classInfo == firstClassInfo)
- {
- classInfo.writeKnownClazz(byteArray, obj);
- }
- else
- {
- classInfo.write(byteArray, obj);
- }
+ classInfo.write(byteArray, obj);
}
}
}
@@ -76,7 +67,8 @@ public class VariableFieldInfo extends FieldInfo
{
switch (flag)
{
- 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.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));
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/jdk/CalendarSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/CalendarSerializer.java
new file mode 100644
index 0000000..2cf5499
--- /dev/null
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/CalendarSerializer.java
@@ -0,0 +1,25 @@
+package com.jfirer.se2.serializer.impl.jdk;
+
+import com.jfirer.se2.ByteArray;
+import com.jfirer.se2.classinfo.RefTracking;
+import com.jfirer.se2.serializer.Serializer;
+
+import java.util.Calendar;
+
+public class CalendarSerializer implements Serializer
+{
+ @Override
+ public void writeBytes(ByteArray byteArray, Object instance)
+ {
+ byteArray.writeVarLong(((Calendar) instance).getTimeInMillis());
+ }
+
+ @Override
+ public Object read(ByteArray byteArray, RefTracking refTracking)
+ {
+ long l = byteArray.readVarLong();
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(l);
+ return calendar;
+ }
+}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/jdk/ClassSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/ClassSerializer.java
new file mode 100644
index 0000000..04fdf60
--- /dev/null
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/ClassSerializer.java
@@ -0,0 +1,29 @@
+package com.jfirer.se2.serializer.impl.jdk;
+
+import com.jfirer.se2.ByteArray;
+import com.jfirer.se2.classinfo.RefTracking;
+import com.jfirer.se2.serializer.Serializer;
+
+public class ClassSerializer implements Serializer
+{
+ @Override
+ public void writeBytes(ByteArray byteArray, Object instance)
+ {
+ Class> clz = (Class>) instance;
+ byteArray.writeString(clz.getName());
+ }
+
+ @Override
+ public Object read(ByteArray byteArray, RefTracking refTracking)
+ {
+ String name = byteArray.readString();
+ try
+ {
+ return Class.forName(name);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/DateSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/DateSerializer.java
similarity index 91%
rename from src/main/java/com/jfirer/se2/serializer/impl/DateSerializer.java
rename to src/main/java/com/jfirer/se2/serializer/impl/jdk/DateSerializer.java
index 17d17df..99e488d 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/DateSerializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/DateSerializer.java
@@ -1,4 +1,4 @@
-package com.jfirer.se2.serializer.impl;
+package com.jfirer.se2.serializer.impl.jdk;
import com.jfirer.se2.ByteArray;
import com.jfirer.se2.classinfo.RefTracking;
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/ListSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/ListSerializer.java
similarity index 97%
rename from src/main/java/com/jfirer/se2/serializer/impl/ListSerializer.java
rename to src/main/java/com/jfirer/se2/serializer/impl/jdk/ListSerializer.java
index 4801230..1ae3012 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/ListSerializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/ListSerializer.java
@@ -1,4 +1,4 @@
-package com.jfirer.se2.serializer.impl;
+package com.jfirer.se2.serializer.impl.jdk;
import com.jfirer.se2.ByteArray;
import com.jfirer.se2.JfireSE;
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/MapSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/MapSerializer.java
similarity index 97%
rename from src/main/java/com/jfirer/se2/serializer/impl/MapSerializer.java
rename to src/main/java/com/jfirer/se2/serializer/impl/jdk/MapSerializer.java
index 515ff1d..363c5f2 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/MapSerializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/MapSerializer.java
@@ -1,4 +1,4 @@
-package com.jfirer.se2.serializer.impl;
+package com.jfirer.se2.serializer.impl.jdk;
import com.jfirer.se2.ByteArray;
import com.jfirer.se2.JfireSE;
@@ -23,7 +23,7 @@ public class MapSerializer implements Serializer
public MapSerializer(JfireSE jfireSE, Class extends Map> type)
{
this.jfireSE = jfireSE;
- if (type.equals(Map.class))
+ if (type.equals(HashMap.class))
{
this.type = HASHMAP;
}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/jdk/MethodSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/MethodSerializer.java
new file mode 100644
index 0000000..3048326
--- /dev/null
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/MethodSerializer.java
@@ -0,0 +1,61 @@
+package com.jfirer.se2.serializer.impl.jdk;
+
+import com.jfirer.baseutil.reflect.ReflectUtil;
+import com.jfirer.se2.ByteArray;
+import com.jfirer.se2.classinfo.RefTracking;
+import com.jfirer.se2.serializer.Serializer;
+
+import java.lang.reflect.Method;
+
+public class MethodSerializer implements Serializer
+{
+ @Override
+ public void writeBytes(ByteArray byteArray, Object instance)
+ {
+ Method method = (Method) instance;
+ byteArray.writeString(method.getDeclaringClass().getName());
+ byteArray.writeString(method.getName());
+ byteArray.writePositiveVarInt(method.getParameterCount());
+ for (Class> each : method.getParameterTypes())
+ {
+ byteArray.writeString(each.getName());
+ }
+ }
+
+ @Override
+ public Object read(ByteArray byteArray, RefTracking refTracking)
+ {
+ String className = byteArray.readString();
+ String methodName = byteArray.readString();
+ int parameterCount = byteArray.readPositiveVarInt();
+ if (parameterCount == 0)
+ {
+ try
+ {
+ return Class.forName(className).getDeclaredMethod(methodName);
+ }
+ catch (Throwable e)
+ {
+ ReflectUtil.throwException(e);
+ return null;
+ }
+ }
+ else
+ {
+ try
+ {
+ Class>[] parameterTypes = new Class[parameterCount];
+ for (int i = 0; i < parameterCount; i++)
+ {
+ parameterTypes[i] = Class.forName(byteArray.readString());
+ }
+ return Class.forName(className).getDeclaredMethod(methodName, parameterTypes);
+ }
+ catch (Throwable e)
+ {
+ ReflectUtil.throwException(e);
+ return null;
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/SetSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/SetSerializer.java
similarity index 98%
rename from src/main/java/com/jfirer/se2/serializer/impl/SetSerializer.java
rename to src/main/java/com/jfirer/se2/serializer/impl/jdk/SetSerializer.java
index a72ba59..e5e1754 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/SetSerializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/SetSerializer.java
@@ -1,4 +1,4 @@
-package com.jfirer.se2.serializer.impl;
+package com.jfirer.se2.serializer.impl.jdk;
import com.jfirer.se2.ByteArray;
import com.jfirer.se2.JfireSE;
diff --git a/src/main/java/com/jfirer/se2/serializer/impl/SqlDateSerializer.java b/src/main/java/com/jfirer/se2/serializer/impl/jdk/SqlDateSerializer.java
similarity index 91%
rename from src/main/java/com/jfirer/se2/serializer/impl/SqlDateSerializer.java
rename to src/main/java/com/jfirer/se2/serializer/impl/jdk/SqlDateSerializer.java
index cd6f3a1..74a0efe 100644
--- a/src/main/java/com/jfirer/se2/serializer/impl/SqlDateSerializer.java
+++ b/src/main/java/com/jfirer/se2/serializer/impl/jdk/SqlDateSerializer.java
@@ -1,4 +1,4 @@
-package com.jfirer.se2.serializer.impl;
+package com.jfirer.se2.serializer.impl.jdk;
import com.jfirer.se2.ByteArray;
import com.jfirer.se2.classinfo.RefTracking;
diff --git a/src/test/java/org/example/FunctionTest.java b/src/test/java/org/example/FunctionTest.java
index 0fcb8fc..360acd6 100644
--- a/src/test/java/org/example/FunctionTest.java
+++ b/src/test/java/org/example/FunctionTest.java
@@ -47,11 +47,13 @@ public class FunctionTest
@Test
public void test3()
{
- Fury fury = Fury.builder().requireClassRegistration(false).build();
- TestData[] data = new TestData[2];
- data[0] = new TestData();
- fury.serialize(data);
+ Fury fury = Fury.builder().requireClassRegistration(false).withRefTracking(true).build();
+ Home home = new Home();
+ Person person = new Person();
+ home.setPerson(person);
+ person.setHome(home);
+ fury.serialize(home);
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ jfireSE.serialize(home);
}
-
-
}
diff --git a/src/test/java/org/example/Home.java b/src/test/java/org/example/Home.java
new file mode 100644
index 0000000..783003c
--- /dev/null
+++ b/src/test/java/org/example/Home.java
@@ -0,0 +1,10 @@
+package org.example;
+
+import lombok.Data;
+
+@Data
+public class Home
+{
+ private int size;
+ private Person person;
+}
diff --git a/src/test/java/org/example/Person.java b/src/test/java/org/example/Person.java
new file mode 100644
index 0000000..2883481
--- /dev/null
+++ b/src/test/java/org/example/Person.java
@@ -0,0 +1,10 @@
+package org.example;
+
+import lombok.Data;
+
+@Data
+public class Person
+{
+ private int age;
+ private Home home;
+}
diff --git a/src/test/java/org/example/festest/BaseTest.java b/src/test/java/org/example/festest/BaseTest.java
new file mode 100644
index 0000000..6411e35
--- /dev/null
+++ b/src/test/java/org/example/festest/BaseTest.java
@@ -0,0 +1,27 @@
+package org.example.festest;
+
+import com.jfirer.se2.JfireSE;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BaseTest
+{
+ @Test
+ public void test()
+ {
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ User user = new User();
+ user.setAge(123);
+ user.setName("aaa");
+ Home home = new Home();
+ home.setAddress("ssss");
+ home.setUser(user);
+ user.setHome(home);
+ byte[] serialize = jfireSE.serialize(user);
+ User another = (User) jfireSE.deSerialize(serialize);
+ Assert.assertEquals(user.getAge(), another.getAge());
+ Assert.assertEquals(user.getName(), another.getName());
+ Home home1 = user.getHome();
+ Assert.assertEquals(home.getAddress(), home1.getAddress());
+ }
+}
diff --git a/src/test/java/org/example/festest/BenchMark.java b/src/test/java/org/example/festest/BenchMark.java
new file mode 100644
index 0000000..0b33fbc
--- /dev/null
+++ b/src/test/java/org/example/festest/BenchMark.java
@@ -0,0 +1,48 @@
+package org.example.festest;
+
+import com.jfirer.fse.ByteArray;
+import com.jfirer.se2.JfireSE;
+import org.apache.fury.Fury;
+import org.apache.fury.config.Language;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.util.concurrent.TimeUnit;
+
+@BenchmarkMode(Mode.Throughput)
+@Warmup(iterations = 2, time = 1)
+@Measurement(iterations = 3, time = 3)
+@Threads(1)
+@Fork(2)
+@OutputTimeUnit(TimeUnit.SECONDS)
+@State(Scope.Benchmark)
+public class BenchMark
+{
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ TestData data = new TestData();
+ ByteArray buf = ByteArray.allocate(100);
+ Fury fury = Fury.builder().withLanguage(Language.JAVA)//
+ .requireClassRegistration(false)//
+ .withRefTracking(true).build();
+
+ @Benchmark
+ public void testFury()
+ {
+ byte[] bytes = fury.serialize(data);
+ }
+
+ @Benchmark
+ public void testJfireSE()
+ {
+ jfireSE.serialize(data);
+ }
+
+ public static void main(String[] args) throws RunnerException
+ {
+ Options opt = new OptionsBuilder().include(BenchMark.class.getSimpleName()).build();
+ new Runner(opt).run();
+ }
+}
diff --git a/src/test/java/org/example/festest/Home.java b/src/test/java/org/example/festest/Home.java
new file mode 100644
index 0000000..fbe23cb
--- /dev/null
+++ b/src/test/java/org/example/festest/Home.java
@@ -0,0 +1,28 @@
+package org.example.festest;
+
+
+public class Home
+{
+ private String address;
+ private User user;
+
+ public String getAddress()
+ {
+ return address;
+ }
+
+ public void setAddress(String address)
+ {
+ this.address = address;
+ }
+
+ public User getUser()
+ {
+ return user;
+ }
+
+ public void setUser(User user)
+ {
+ this.user = user;
+ }
+}
diff --git a/src/test/java/org/example/festest/LongData2.java b/src/test/java/org/example/festest/LongData2.java
new file mode 100644
index 0000000..e143ecf
--- /dev/null
+++ b/src/test/java/org/example/festest/LongData2.java
@@ -0,0 +1,94 @@
+package org.example.festest;
+
+public class LongData2
+{
+ private int a = 213212312;
+ private boolean b = false;
+ private char c = 'c';
+ private byte d = 0x11;
+ private short e = 24;
+ private long f = 1213124131312321L;
+ private double g = 231321.2132;
+ private float h = (float) 4986.2;
+ private String name = "林斌";
+
+ public int getA()
+ {
+ return a;
+ }
+
+ public void setA(int a)
+ {
+ this.a = a;
+ }
+
+ public boolean isB()
+ {
+ return b;
+ }
+
+ public void setB(boolean b)
+ {
+ this.b = b;
+ }
+
+ public char getC()
+ {
+ return c;
+ }
+
+ public void setC(char c)
+ {
+ this.c = c;
+ }
+
+ public byte getD()
+ {
+ return d;
+ }
+
+ public void setD(byte d)
+ {
+ this.d = d;
+ }
+
+ public short getE()
+ {
+ return e;
+ }
+
+ public void setE(short e)
+ {
+ this.e = e;
+ }
+
+ public long getF()
+ {
+ return f;
+ }
+
+ public void setF(long f)
+ {
+ this.f = f;
+ }
+
+ public double getG()
+ {
+ return g;
+ }
+
+ public void setG(double g)
+ {
+ this.g = g;
+ }
+
+ public float getH()
+ {
+ return h;
+ }
+
+ public void setH(float h)
+ {
+ this.h = h;
+ }
+}
diff --git a/src/test/java/org/example/festest/LongTest.java b/src/test/java/org/example/festest/LongTest.java
new file mode 100644
index 0000000..0ab311b
--- /dev/null
+++ b/src/test/java/org/example/festest/LongTest.java
@@ -0,0 +1,39 @@
+package org.example.festest;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Output;
+import com.jfirer.se2.JfireSE;
+import lombok.extern.slf4j.Slf4j;
+import org.example.festest.data.BaseData;
+import org.example.festest.data.LongData;
+import org.junit.Test;
+
+import java.io.UnsupportedEncodingException;
+
+@Slf4j
+public class LongTest
+{
+ @Test
+ public void longtest() throws IllegalArgumentException, IllegalAccessException, UnsupportedEncodingException, ClassNotFoundException, InstantiationException
+ {
+ Kryo kryo = new Kryo();
+ kryo.setReferences(true);
+ Output output = null;
+ output = new Output(1, 15096);
+ kryo.writeClassAndObject(output, new LongData());
+ byte[] bb = output.toBytes();
+ System.out.println("LongData序列化:kryo基础数据长度:" + bb.length);
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(new LongData());
+ System.out.println("LongData序列化:jfirese基础数据长度:" + serialize.length);
+ System.out.println("序列化长度减少" + (bb.length - serialize.length));
+ output = new Output(1, 15096);
+ kryo.writeClassAndObject(output, new BaseData(1));
+ bb = output.toBytes();
+ log.debug("basedata序列化:kryo基础数据长度:{}", bb.length);
+ byte[] serialize1 = jfireSE.serialize(new BaseData(1));
+ log.info("basedata序列化:jfirese基础数据长度:" + serialize1.length);
+ log.info("序列化长度减少{}", (bb.length - serialize1.length));
+ }
+
+}
diff --git a/src/test/java/org/example/festest/MapTest.java b/src/test/java/org/example/festest/MapTest.java
new file mode 100644
index 0000000..b554717
--- /dev/null
+++ b/src/test/java/org/example/festest/MapTest.java
@@ -0,0 +1,27 @@
+package org.example.festest;
+
+import com.jfirer.se2.JfireSE;
+import lombok.Data;
+import org.example.festest.data.BaseData;
+import org.junit.Test;
+
+import java.util.HashMap;
+
+public class MapTest
+{
+ @Data
+ public class MapDemo
+ {
+ private HashMap map = new HashMap();
+ }
+
+ @Test
+ public void test()
+ {
+ MapDemo demo = new MapDemo();
+ demo.getMap().put(1, new BaseData());
+ JfireSE jfireSE = JfireSE.staticRegisterClass(MapDemo.class).refTracking().build();
+ byte[] serialize = jfireSE.serialize(demo);
+ jfireSE.deSerialize(serialize);
+ }
+}
diff --git a/src/test/java/org/example/festest/RandomString.java b/src/test/java/org/example/festest/RandomString.java
new file mode 100644
index 0000000..bed9c09
--- /dev/null
+++ b/src/test/java/org/example/festest/RandomString.java
@@ -0,0 +1,42 @@
+package org.example.festest;
+
+import java.util.Random;
+
+public class RandomString
+{
+ private static Random random = new Random();
+ private static char[] numbers = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
+ private static char[] charAndNumbers = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
+
+ /**
+ * 得到一个随机的数字串,位数由参数指定
+ *
+ * @param size
+ * @return
+ */
+ public static String getNumber(int size)
+ {
+ char[] tmp = new char[size];
+ for (int i = 0; i < size; i++)
+ {
+ tmp[i] = numbers[random.nextInt(10)];
+ }
+ return new String(tmp);
+ }
+
+ /**
+ * 返回一个长度为size的随机字符串,可能包含数字和字母
+ *
+ * @param size
+ * @return
+ */
+ public static String randomString(int size)
+ {
+ char[] tmp = new char[size];
+ for (int i = 0; i < size; i++)
+ {
+ tmp[i] = charAndNumbers[random.nextInt(62)];
+ }
+ return new String(tmp);
+ }
+}
diff --git a/src/test/java/org/example/festest/RightTest.java b/src/test/java/org/example/festest/RightTest.java
new file mode 100644
index 0000000..587a6a5
--- /dev/null
+++ b/src/test/java/org/example/festest/RightTest.java
@@ -0,0 +1,283 @@
+package org.example.festest;
+
+import com.jfirer.se2.JfireSE;
+import org.example.festest.data.*;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Random;
+
+import static org.junit.Assert.*;
+
+public class RightTest
+{
+ @Test
+ public void baseTypeTest() throws IllegalArgumentException, IllegalAccessException, UnsupportedEncodingException, ClassNotFoundException, InstantiationException
+ {
+ // 创建需要序列化的对象
+ BaseData baseData = new BaseData(1);
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).staticRegisterClass(baseData.getClass()).build();
+ byte[] serialize = jfireSE.serialize(baseData);
+ // 传入二进制buffer对象,读取其中的 数据并且反序列化成对象
+ BaseData result = (BaseData) jfireSE.deSerialize(serialize);
+ assertEquals(result.getA(), baseData.getA());
+ assertEquals(result.isB(), baseData.isB());
+ assertEquals(result.getC(), baseData.getC());
+ assertEquals(result.getD(), baseData.getD());
+ assertEquals(result.getE(), baseData.getE());
+ assertEquals(result.getF(), baseData.getF());
+ assertEquals(result.getG(), baseData.getG(), 0.01);
+ assertEquals(result.getI(), baseData.getI());
+ assertEquals(result.getH(), baseData.getH(), 0.01);
+ for (int i = 0; i < result.getJ().length; i++)
+ {
+ assertEquals(result.getJ()[i], baseData.getJ()[i]);
+ }
+ for (int i = 0; i < result.getK().length; i++)
+ {
+ assertEquals(result.getK()[i], baseData.getK()[i]);
+ }
+ for (int i = 0; i < result.getL().length; i++)
+ {
+ assertEquals(result.getL()[i], baseData.getL()[i]);
+ }
+ for (int i = 0; i < result.getM().length; i++)
+ {
+ assertEquals(result.getM()[i], baseData.getM()[i]);
+ }
+ for (int i = 0; i < result.getN().length; i++)
+ {
+ assertEquals(result.getN()[i], baseData.getN()[i]);
+ }
+ for (int i = 0; i < result.getO().length; i++)
+ {
+ assertEquals(result.getO()[i], baseData.getO()[i]);
+ }
+ for (int i = 0; i < result.getP().length; i++)
+ {
+ assertEquals(result.getP()[i], baseData.getP()[i], 0.1);
+ }
+ for (int i = 0; i < result.getQ().length; i++)
+ {
+ assertEquals(result.getQ()[i], baseData.getQ()[i], 0.1);
+ }
+ for (int i = 0; i < result.getR().length; i++)
+ {
+ assertEquals(result.getR()[i], baseData.getR()[i]);
+ }
+ //
+ }
+
+ @Test
+ public void wrapTest() throws IllegalArgumentException, IllegalAccessException, UnsupportedEncodingException, ClassNotFoundException, InstantiationException
+ {
+ WrapData wrapData = new WrapData();
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).staticRegisterClass(WrapData.class).build();
+ byte[] serialize = jfireSE.serialize(wrapData);
+ WrapData result = (WrapData) jfireSE.deSerialize(serialize);
+ assertEquals(result.getA(), wrapData.getA());
+ assertEquals(result.getB(), wrapData.getB());
+ assertEquals(result.getC(), wrapData.getC());
+ assertEquals(result.getD(), wrapData.getD());
+ assertEquals(result.getE(), wrapData.getE());
+ assertEquals(result.getF(), wrapData.getF());
+ assertEquals(result.getG(), wrapData.getG(), 0.01);
+ assertEquals(result.getH(), wrapData.getH(), 0.01);
+ assertEquals(result.getI(), wrapData.getI());
+ for (int i = 0; i < result.getJ().length; i++)
+ {
+ assertEquals(result.getJ()[i], wrapData.getJ()[i]);
+ }
+ for (int i = 0; i < result.getK().length; i++)
+ {
+ assertEquals(result.getK()[i], wrapData.getK()[i]);
+ }
+ for (int i = 0; i < result.getL().length; i++)
+ {
+ assertEquals(result.getL()[i], wrapData.getL()[i]);
+ }
+ for (int i = 0; i < result.getM().length; i++)
+ {
+ assertEquals(result.getM()[i], wrapData.getM()[i]);
+ }
+ for (int i = 0; i < result.getN().length; i++)
+ {
+ assertEquals(result.getN()[i], wrapData.getN()[i]);
+ }
+ for (int i = 0; i < result.getO().length; i++)
+ {
+ assertEquals(result.getO()[i], wrapData.getO()[i]);
+ }
+ for (int i = 0; i < result.getP().length; i++)
+ {
+ assertEquals(result.getP()[i], wrapData.getP()[i], 0.1);
+ }
+ for (int i = 0; i < result.getQ().length; i++)
+ {
+ assertEquals(result.getQ()[i], wrapData.getQ()[i], 0.1);
+ }
+ for (int i = 0; i < result.getR().length; i++)
+ {
+ assertEquals(result.getR()[i], wrapData.getR()[i]);
+ }
+ for (int i = 0; i < wrapData.getList().size(); i++)
+ {
+ BaseData a = wrapData.getList().get(i);
+ BaseData b = result.getList().get(i);
+ Assert.assertTrue(a.equals(b));
+ }
+ for (int i = 0; i < wrapData.getMap().size(); i++)
+ {
+ Assert.assertTrue(wrapData.getMap().get(i).equals(result.getMap().get(i)));
+ }
+ for (int i = 0; i < wrapData.getW().length; i++)
+ {
+ for (int j = 0; j < wrapData.getW()[i].length; j++)
+ {
+ Assert.assertEquals(result.getW()[i][j], wrapData.getW()[i][j]);
+ }
+ }
+ }
+
+ @Test
+ public void referenceTest()
+ {
+ Person person = new Person("linbin", 25);
+ Person tPerson = new Person("zhangshi[in", 30);
+ person.setLeader(tPerson);
+ tPerson.setLeader(person);
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(person);
+ Person result = (Person) jfireSE.deSerialize(serialize);
+ assertEquals("zhangshi[in", result.getLeader().getName());
+ }
+
+ @Test
+ public void objectTest() throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException, InstantiationException
+ {
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ Calendar calendar = Calendar.getInstance();
+ byte[] serialize = jfireSE.serialize(calendar);
+ Calendar reCalendar = (Calendar) jfireSE.deSerialize(serialize);
+ Assert.assertTrue(reCalendar.equals(calendar));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void listTest() throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException, InstantiationException
+ {
+ ArrayList list = new ArrayList();
+ for (int i = 0; i < 5; i++)
+ {
+ list.add(new BaseData(i));
+ }
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(list);
+ ArrayList result = (ArrayList) jfireSE.deSerialize(serialize);
+ Assert.assertTrue(list.equals(result));
+ }
+
+ @Test
+ public void baseDataTest()
+ {
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ BaseData baseData = new BaseData();
+ byte[] serialize = jfireSE.serialize(baseData);
+ BaseData result = (BaseData) jfireSE.deSerialize(serialize);
+ assertTrue(result.equals(baseData));
+ }
+
+ @Test
+ public void objectArrayTest()
+ {
+ Object[] array = new Object[4];
+ array[0] = new Person();
+ array[1] = new BaseData();
+ array[2] = new LongData();
+ array[3] = new WrapData();
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(array);
+ Object[] result = (Object[]) jfireSE.deSerialize(serialize);
+ Assert.assertTrue(((Person) result[0]).equals(array[0]));
+ }
+
+ @Test
+ public void byteArrayTest()
+ {
+ byte[] array = new byte[]{1, 2, 5, 6, 8, 9};
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(array);
+ byte[] result = (byte[]) jfireSE.deSerialize(serialize);
+ for (int i = 0; i < array.length; i++)
+ {
+ assertEquals(array[i], result[i]);
+ }
+ }
+
+ @Test
+ public void booleanArrayTest()
+ {
+ boolean[] array = new boolean[]{true, false, false, true, true, true};
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(array);
+ boolean[] result = (boolean[]) jfireSE.deSerialize(serialize);
+ for (int i = 0; i < array.length; i++)
+ {
+ assertEquals(array[i], result[i]);
+ }
+ }
+
+ @Test
+ public void arrayDataTest()
+ {
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(new ArrayData());
+ jfireSE.deSerialize(serialize);
+ }
+
+ @Test
+ public void objectArrTest()
+ {
+ Random random = new Random();
+ byte[] key = new byte[16];
+ random.nextBytes(key);
+ Object[] data = new Object[]{Integer.valueOf(14), new BaseData[]{new BaseData(), new BaseData()}};
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(data);
+ Object[] result = (Object[]) jfireSE.deSerialize(serialize);
+ assertEquals(14, result[0]);
+ assertEquals(((BaseData[]) data[1])[0], ((BaseData[]) result[1])[0]);
+ assertEquals(((BaseData[]) data[1])[1], ((BaseData[]) result[1])[1]);
+ }
+
+ /**
+ * 不注册类型直接序列化时,数组实例多次被引用能够正确序列化
+ */
+ @Test
+ public void arryaNotRegisterClassSeri()
+ {
+ ArrayRefenceHolder holder = new ArrayRefenceHolder();
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(holder);
+ ArrayRefenceHolder result = (ArrayRefenceHolder) jfireSE.deSerialize(serialize);
+ assertArrayEquals(new int[]{1, 2}, result.getA()[0]);
+ assertArrayEquals(new int[]{3, 4}, result.getA()[1]);
+ assertArrayEquals(new int[]{1, 2}, result.getB()[0]);
+ assertArrayEquals(new int[]{3, 4}, result.getB()[1]);
+ }
+
+ @Test
+ public void methodObjectTest() throws NoSuchMethodException
+ {
+ Method methodObjectTest = this.getClass().getDeclaredMethod("methodObjectTest");
+ JfireSE jfireSE = JfireSE.supportRefTracking(true).build();
+ byte[] serialize = jfireSE.serialize(methodObjectTest);
+ Method method = (Method) jfireSE.deSerialize(serialize);
+ System.out.println(method.equals(methodObjectTest));
+ assertEquals(methodObjectTest, method);
+ }
+}
diff --git a/src/test/java/org/example/festest/SimplePerson.java b/src/test/java/org/example/festest/SimplePerson.java
new file mode 100644
index 0000000..5a4313b
--- /dev/null
+++ b/src/test/java/org/example/festest/SimplePerson.java
@@ -0,0 +1,65 @@
+package org.example.festest;
+
+public class SimplePerson
+{
+ private int age;
+ private String name;
+ private Float weight;
+
+ @Override
+ public String toString()
+ {
+ return "Person{" + "age=" + age + ", name='" + name + '\'' + ", weight=" + weight + '}';
+ }
+
+ @Override
+ public boolean equals(Object x)
+ {
+ if (x instanceof SimplePerson)
+ {
+ SimplePerson target = (SimplePerson) x;
+ if (target.age == age && name.equals(target.name) && target.weight.floatValue() == weight.floatValue())
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public int getAge()
+ {
+ return age;
+ }
+
+ public void setAge(int age)
+ {
+ this.age = age;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public Float getWeight()
+ {
+ return weight;
+ }
+
+ public void setWeight(Float weight)
+ {
+ this.weight = weight;
+ }
+}
diff --git a/src/test/java/org/example/festest/TestData.java b/src/test/java/org/example/festest/TestData.java
new file mode 100644
index 0000000..7a06c05
--- /dev/null
+++ b/src/test/java/org/example/festest/TestData.java
@@ -0,0 +1,110 @@
+package org.example.festest;
+
+import java.io.Serializable;
+
+
+public class TestData implements Serializable
+{
+ private int a = 213212312;
+ private boolean b = false;
+ private char c = 'c';
+ private byte d = 0x11;
+ private short e = 24;
+ private long f = 1213124131312321L;
+ private double g = 231321.2132;
+ private float h = (float) 4986.2;
+ private String i = "123452312316789a";
+// private int[] j = new int[]{1, 2, 4, 5};
+// private boolean[] k = new boolean[]{true, false, true, false, false, false, true};
+// private char[] l = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+// private byte[] m = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+// private short[] n = new short[]{3, 8, 213, 451, 312, 45};
+// private long[] o = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+// private double[] p = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+// private float[] q = new float[]{46486.2f, 49849.2f, 646854.6f};
+// private String[] r = new String[]{"abcdf12345", "abdfcgf12323"};
+
+ public boolean equals(Object x)
+ {
+ if (x instanceof TestData)
+ {
+ TestData target = (TestData) x;
+ if (target.a == a && target.b == b && target.c == c && target.d == d && target.e == e && target.f == f && target.g == g && target.h == h && target.i.equals(i))
+ {
+// for (int i = 0; i < target.j.length; i++)
+// {
+// if (target.j[i] != j[i])
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < k.length; i++)
+// {
+// if (target.k[i] != k[i])
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < l.length; i++)
+// {
+// if (target.l[i] != l[i])
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < m.length; i++)
+// {
+// if (target.m[i] != m[i])
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < n.length; i++)
+// {
+// if (target.n[i] != n[i])
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < o.length; i++)
+// {
+// if (target.o[i] != o[i])
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < p.length; i++)
+// {
+// if (p[i] != target.p[i])
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < r.length; i++)
+// {
+// if (target.r[i].equals(r[i]) == false)
+// {
+// return false;
+// }
+// }
+// for (int i = 0; i < q.length; i++)
+// {
+// if (q[i] != target.q[i])
+// {
+// return false;
+// }
+// }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+}
diff --git a/src/test/java/org/example/festest/User.java b/src/test/java/org/example/festest/User.java
new file mode 100644
index 0000000..c2d1a4b
--- /dev/null
+++ b/src/test/java/org/example/festest/User.java
@@ -0,0 +1,38 @@
+package org.example.festest;
+
+public class User
+{
+ private int age;
+ private String name;
+ private Home home;
+
+ public Home getHome()
+ {
+ return home;
+ }
+
+ public void setHome(Home home)
+ {
+ this.home = home;
+ }
+
+ public int getAge()
+ {
+ return age;
+ }
+
+ public void setAge(int age)
+ {
+ this.age = age;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/ArrayData.java b/src/test/java/org/example/festest/data/ArrayData.java
new file mode 100644
index 0000000..472d612
--- /dev/null
+++ b/src/test/java/org/example/festest/data/ArrayData.java
@@ -0,0 +1,104 @@
+package org.example.festest.data;
+
+public class ArrayData
+{
+ private Object j1 = new int[]{1, 2, 4, 5};
+ private Object k1 = new boolean[]{true, false, true, false, false, false, true};
+ private Object l1 = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private Object m1 = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private Object n1 = new short[]{3, 8, 213, 451, 312, 45};
+ private Object o1 = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private Object p1 = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private Object q1 = new float[]{46486.2f, 49849.2f, 646854.6f};
+ private Object r1 = new String[]{"adasdasdasd", "dsadq2eafsa"};
+
+ public Object getK1()
+ {
+ return k1;
+ }
+
+ public void setK1(Object k1)
+ {
+ this.k1 = k1;
+ }
+
+ public Object getL1()
+ {
+ return l1;
+ }
+
+ public void setL1(Object l1)
+ {
+ this.l1 = l1;
+ }
+
+ public Object getM1()
+ {
+ return m1;
+ }
+
+ public void setM1(Object m1)
+ {
+ this.m1 = m1;
+ }
+
+ public Object getN1()
+ {
+ return n1;
+ }
+
+ public void setN1(Object n1)
+ {
+ this.n1 = n1;
+ }
+
+ public Object getO1()
+ {
+ return o1;
+ }
+
+ public void setO1(Object o1)
+ {
+ this.o1 = o1;
+ }
+
+ public Object getP1()
+ {
+ return p1;
+ }
+
+ public void setP1(Object p1)
+ {
+ this.p1 = p1;
+ }
+
+ public Object getQ1()
+ {
+ return q1;
+ }
+
+ public void setQ1(Object q1)
+ {
+ this.q1 = q1;
+ }
+
+ public Object getR1()
+ {
+ return r1;
+ }
+
+ public void setR1(Object r1)
+ {
+ this.r1 = r1;
+ }
+
+ public Object getJ1()
+ {
+ return j1;
+ }
+
+ public void setJ1(Object j1)
+ {
+ this.j1 = j1;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/ArrayRefenceHolder.java b/src/test/java/org/example/festest/data/ArrayRefenceHolder.java
new file mode 100644
index 0000000..ad42edb
--- /dev/null
+++ b/src/test/java/org/example/festest/data/ArrayRefenceHolder.java
@@ -0,0 +1,33 @@
+package org.example.festest.data;
+
+public class ArrayRefenceHolder
+{
+ private int[][] a;
+ private int[][] b;
+
+ public ArrayRefenceHolder()
+ {
+ a = new int[][]{{1, 2}, {3, 4}};
+ b = a;
+ }
+
+ public int[][] getA()
+ {
+ return a;
+ }
+
+ public int[][] getB()
+ {
+ return b;
+ }
+
+ public void setB(int[][] b)
+ {
+ this.b = b;
+ }
+
+ public void setA(int[][] a)
+ {
+ this.a = a;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/BaseData.java b/src/test/java/org/example/festest/data/BaseData.java
new file mode 100644
index 0000000..f9111dc
--- /dev/null
+++ b/src/test/java/org/example/festest/data/BaseData.java
@@ -0,0 +1,556 @@
+package org.example.festest.data;
+
+import org.example.festest.RandomString;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Random;
+
+public class BaseData implements Serializable
+{
+ public int a = 213212312;
+ private Date[] dates = new Date[]{new Date(13536156), new Date(54454655)};
+ private int index = 0;
+ private boolean b = false;
+ private char c = 'c';
+ private byte d = 0x11;
+ private short e = 24;
+ private long f = 1213124131312321L;
+ private double g = 231321.2132;
+ private float h = (float) 4986.2;
+ private String i = "123452312316789a";
+ private int[] j = new int[]{1, 2, 4, 5};
+ private boolean[] k = new boolean[]{true, false, true, false, false, false, true};
+ private char[] l = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private byte[] m = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private short[] n = new short[]{3, 8, 213, 451, 312, 45};
+ private long[] o = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private double[] p = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private float[] q = new float[]{46486.2f, 49849.2f, 646854.6f};
+ private String[] r = new String[]{"abcdf12345", "abdfcgf12323"};
+ private int[][] j2 = new int[][]{{1, 2, 4, 5}, {1, 2, 3, 4, 5, 6}};
+ private boolean[][] k2 = new boolean[][]{{true, false, true, false, false, false, true}, {true, false, true, false, false, false, false}};
+ private char[][] l2 = new char[][]{{'a', 'v', 'q', 'j', 'h', 'e', 'f'}, {'a', 'v', 'q', 'j', 'h', 'e', 'f'}};
+ private byte[][] m2 = new byte[][]{{0x32, 0x12, 0x34, (byte) 0x96}, {0x32, 0x12, 0x34, (byte) 0x96}};
+ private short[][] n2 = new short[][]{{3, 8, 213, 451, 312, 45}, {3, 8, 213, 451, 312, 45}};
+ private long[][] o2 = new long[][]{{12313131313l, 524141431313l, 3131231231425l, 1313123121l}, {12313131313l, 524141431313l, 3131231231425l, 1313123121l}};
+ private double[][] p2 = new double[][]{{6468613646.48646d, 4646.456d, 546864648867.466d}, {6468613646.48646d, 4646.456d, 546864648867.466d}};
+ private float[][] q2 = new float[][]{{46486.2f, 49849.2f, 646854.6f}, {46486.2f, 49849.2f, 646854.6f}};
+ private String[][] r2 = new String[2][];
+
+ private Object j1 = new int[]{1, 2, 4, 5};
+ private Object k1 = new boolean[]{true, false, true, false, false, false, true};
+ private Object l1 = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private Object m1 = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private Object n1 = new short[]{3, 8, 213, 451, 312, 45};
+ private Object o1 = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private Object p1 = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private Object q1 = new float[]{46486.2f, 49849.2f, 646854.6f};
+ private Object r1 = new String[]{"adaseqeddasdasd", "dsadqeq2eafsa"};
+
+ public BaseData()
+ {
+ }
+
+ public BaseData(int index)
+ {
+ Random random = new Random();
+ this.index = index;
+ i = String.valueOf(System.nanoTime() + random.nextInt());
+ r[0] = RandomString.randomString(20);
+ r[1] = RandomString.randomString(20);
+ ((String[]) r1)[0] = RandomString.randomString(20);
+ ((String[]) r1)[1] = RandomString.randomString(20);
+ r2[0] = new String[]{RandomString.randomString(20), RandomString.randomString(20)};
+ r2[1] = new String[]{RandomString.randomString(20), RandomString.randomString(20)};
+ }
+
+ public boolean equals(Object target)
+ {
+ if (target instanceof BaseData)
+ {
+ BaseData baseData = this;
+ BaseData result = (BaseData) target;
+ if (baseData.getIndex() != result.getIndex())
+ {
+ return false;
+ }
+ if (result.getA() != baseData.getA())
+ {
+ return false;
+ }
+ if (result.isB() != baseData.isB())
+ {
+ return false;
+ }
+ if (result.getC() != baseData.getC())
+ {
+ return false;
+ }
+ if (result.getD() != baseData.getD())
+ {
+ return false;
+ }
+ if (result.getE() != baseData.getE())
+ {
+ return false;
+ }
+ if (result.getH() != baseData.getH())
+ {
+ return false;
+ }
+ if (result.getI().equals(baseData.getI()) == false)
+ {
+ return false;
+ }
+ for (int i = 0; i < result.getJ().length; i++)
+ {
+ if (result.getJ()[i] != baseData.getJ()[i])
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < result.getK().length; i++)
+ {
+ if (result.getK()[i] != baseData.getK()[i])
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < result.getL().length; i++)
+ {
+ if (result.getL()[i] != baseData.getL()[i])
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < result.getM().length; i++)
+ {
+ if (result.getM()[i] != baseData.getM()[i])
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < result.getN().length; i++)
+ {
+ if (result.getN()[i] != baseData.getN()[i])
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < result.getO().length; i++)
+ {
+ if (result.getO()[i] != baseData.getO()[i])
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < result.getP().length; i++)
+ {
+ if (result.getP()[i] != baseData.getP()[i])
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < result.getR().length; i++)
+ {
+ if (result.getR()[i].equals(baseData.getR()[i]) == false)
+ {
+ return false;
+ }
+ }
+ for (int i = 0; i < ((int[]) result.getJ1()).length; i++)
+ {
+ if (((int[]) result.getJ1())[i] != ((int[]) baseData.getJ1())[i])
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public short[] getN()
+ {
+ return n;
+ }
+
+ public void setN(short[] n)
+ {
+ this.n = n;
+ }
+
+ public int getIndex()
+ {
+ return index;
+ }
+
+ public void setIndex(int index)
+ {
+ this.index = index;
+ }
+
+ public int getA()
+ {
+ return a;
+ }
+
+ public void setA(int a)
+ {
+ this.a = a;
+ }
+
+ public boolean isB()
+ {
+ return b;
+ }
+
+ public void setB(boolean b)
+ {
+ this.b = b;
+ }
+
+ public char getC()
+ {
+ return c;
+ }
+
+ public void setC(char c)
+ {
+ this.c = c;
+ }
+
+ public byte getD()
+ {
+ return d;
+ }
+
+ public void setD(byte d)
+ {
+ this.d = d;
+ }
+
+ public short getE()
+ {
+ return e;
+ }
+
+ public void setE(short e)
+ {
+ this.e = e;
+ }
+
+ public long getF()
+ {
+ return f;
+ }
+
+ public void setF(long f)
+ {
+ this.f = f;
+ }
+
+ public double getG()
+ {
+ return g;
+ }
+
+ public void setG(double g)
+ {
+ this.g = g;
+ }
+
+ public float getH()
+ {
+ return h;
+ }
+
+ public void setH(float h)
+ {
+ this.h = h;
+ }
+
+ public String getI()
+ {
+ return i;
+ }
+
+ public void setI(String i)
+ {
+ this.i = i;
+ }
+
+ public int[] getJ()
+ {
+ return j;
+ }
+
+ public void setJ(int[] j)
+ {
+ this.j = j;
+ }
+
+ public boolean[] getK()
+ {
+ return k;
+ }
+
+ public void setK(boolean[] k)
+ {
+ this.k = k;
+ }
+
+ public char[] getL()
+ {
+ return l;
+ }
+
+ public void setL(char[] l)
+ {
+ this.l = l;
+ }
+
+ public byte[] getM()
+ {
+ return m;
+ }
+
+ public void setM(byte[] m)
+ {
+ this.m = m;
+ }
+
+ public long[] getO()
+ {
+ return o;
+ }
+
+ public void setO(long[] o)
+ {
+ this.o = o;
+ }
+
+ public double[] getP()
+ {
+ return p;
+ }
+
+ public void setP(double[] p)
+ {
+ this.p = p;
+ }
+
+ public float[] getQ()
+ {
+ return q;
+ }
+
+ public void setQ(float[] q)
+ {
+ this.q = q;
+ }
+
+ public String[] getR()
+ {
+ return r;
+ }
+
+ public void setR(String[] r)
+ {
+ this.r = r;
+ }
+
+ public int[][] getJ2()
+ {
+ return j2;
+ }
+
+ public void setJ2(int[][] j2)
+ {
+ this.j2 = j2;
+ }
+
+ public boolean[][] getK2()
+ {
+ return k2;
+ }
+
+ public void setK2(boolean[][] k2)
+ {
+ this.k2 = k2;
+ }
+
+ public char[][] getL2()
+ {
+ return l2;
+ }
+
+ public void setL2(char[][] l2)
+ {
+ this.l2 = l2;
+ }
+
+ public byte[][] getM2()
+ {
+ return m2;
+ }
+
+ public void setM2(byte[][] m2)
+ {
+ this.m2 = m2;
+ }
+
+ public short[][] getN2()
+ {
+ return n2;
+ }
+
+ public void setN2(short[][] n2)
+ {
+ this.n2 = n2;
+ }
+
+ public long[][] getO2()
+ {
+ return o2;
+ }
+
+ public void setO2(long[][] o2)
+ {
+ this.o2 = o2;
+ }
+
+ public double[][] getP2()
+ {
+ return p2;
+ }
+
+ public void setP2(double[][] p2)
+ {
+ this.p2 = p2;
+ }
+
+ public float[][] getQ2()
+ {
+ return q2;
+ }
+
+ public void setQ2(float[][] q2)
+ {
+ this.q2 = q2;
+ }
+
+ public String[][] getR2()
+ {
+ return r2;
+ }
+
+ public void setR2(String[][] r2)
+ {
+ this.r2 = r2;
+ }
+
+ public Object getJ1()
+ {
+ return j1;
+ }
+
+ public void setJ1(Object j1)
+ {
+ this.j1 = j1;
+ }
+
+ public Object getK1()
+ {
+ return k1;
+ }
+
+ public void setK1(Object k1)
+ {
+ this.k1 = k1;
+ }
+
+ public Object getL1()
+ {
+ return l1;
+ }
+
+ public void setL1(Object l1)
+ {
+ this.l1 = l1;
+ }
+
+ public Object getM1()
+ {
+ return m1;
+ }
+
+ public void setM1(Object m1)
+ {
+ this.m1 = m1;
+ }
+
+ public Object getN1()
+ {
+ return n1;
+ }
+
+ public void setN1(Object n1)
+ {
+ this.n1 = n1;
+ }
+
+ public Object getO1()
+ {
+ return o1;
+ }
+
+ public void setO1(Object o1)
+ {
+ this.o1 = o1;
+ }
+
+ public Object getP1()
+ {
+ return p1;
+ }
+
+ public void setP1(Object p1)
+ {
+ this.p1 = p1;
+ }
+
+ public Object getQ1()
+ {
+ return q1;
+ }
+
+ public void setQ1(Object q1)
+ {
+ this.q1 = q1;
+ }
+
+ public Object getR1()
+ {
+ return r1;
+ }
+
+ public void setR1(Object r1)
+ {
+ this.r1 = r1;
+ }
+
+ public Date[] getDates()
+ {
+ return dates;
+ }
+
+ public void setDates(Date[] dates)
+ {
+ this.dates = dates;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/Device.java b/src/test/java/org/example/festest/data/Device.java
new file mode 100644
index 0000000..106d5a5
--- /dev/null
+++ b/src/test/java/org/example/festest/data/Device.java
@@ -0,0 +1,420 @@
+package org.example.festest.data;
+
+import java.util.Date;
+
+/**
+ * Device entity. @author MyEclipse Persistence Tools
+ */
+
+public class Device implements java.io.Serializable
+{
+ // Fields
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -7833130819750178757L;
+ private long id;
+ private String sn;
+ private String udid;
+ private String openUdid;
+ private String uuid;
+ private String idfa;
+ private String imei;
+ private String mac;
+ private int majorVersion;
+ private int minorVersion;
+ private int buildVersion;
+ private int os;
+ private String osVersion;
+ private int promoPlatformCode;
+ private Date activationTime;
+ private long userId;
+ private boolean bound;
+
+ private int[] j = new int[]{1, 2, 4, 5};
+ private boolean[] k = new boolean[]{true, false, true, false, false, false, true};
+ private char[] l = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private byte[] m = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private short[] n = new short[]{3, 8, 213, 451, 312, 45};
+ private long[] o = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private double[] p = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private float[] q = new float[]{46486.2f, 49849.2f, 646854.6f};
+ private String[] r = new String[]{"abcdf12345", "abdfcgf12323"};
+ private int[][] j2 = new int[][]{{1, 2, 4, 5}, {1, 2, 3, 4, 5, 6}};
+ private boolean[][] k2 = new boolean[][]{{true, false, true, false, false, false, true}, {true, false, true, false, false, false, false}};
+ private char[][] l2 = new char[][]{{'a', 'v', 'q', 'j', 'h', 'e', 'f'}, {'a', 'v', 'q', 'j', 'h', 'e', 'f'}};
+ private byte[][] m2 = new byte[][]{{0x32, 0x12, 0x34, (byte) 0x96}, {0x32, 0x12, 0x34, (byte) 0x96}};
+ private short[][] n2 = new short[][]{{3, 8, 213, 451, 312, 45}, {3, 8, 213, 451, 312, 45}};
+ private long[][] o2 = new long[][]{{12313131313l, 524141431313l, 3131231231425l, 1313123121l}, {12313131313l, 524141431313l, 3131231231425l, 1313123121l}};
+ private double[][] p2 = new double[][]{{6468613646.48646d, 4646.456d, 546864648867.466d}, {6468613646.48646d, 4646.456d, 546864648867.466d}};
+ private float[][] q2 = new float[][]{{46486.2f, 49849.2f, 646854.6f}, {46486.2f, 49849.2f, 646854.6f}};
+ private String[][] r2 = new String[][]{{"12qw", "sad123"}, {"xdr234", "5986sad"}};
+
+ /**
+ * default constructor
+ */
+ public Device()
+ {
+ }
+
+ public static long getSerialversionuid()
+ {
+ return serialVersionUID;
+ }
+
+ public static long getSerialVersionUID()
+ {
+ return serialVersionUID;
+ }
+
+ public long getId()
+ {
+ return id;
+ }
+
+ public void setId(long id)
+ {
+ this.id = id;
+ }
+
+ public String getSn()
+ {
+ return sn;
+ }
+
+ public void setSn(String sn)
+ {
+ this.sn = sn;
+ }
+
+ public String getUdid()
+ {
+ return udid;
+ }
+
+ public void setUdid(String udid)
+ {
+ this.udid = udid;
+ }
+
+ public String getOpenUdid()
+ {
+ return openUdid;
+ }
+
+ public void setOpenUdid(String openUdid)
+ {
+ this.openUdid = openUdid;
+ }
+
+ public String getUuid()
+ {
+ return uuid;
+ }
+
+ public void setUuid(String uuid)
+ {
+ this.uuid = uuid;
+ }
+
+ public String getIdfa()
+ {
+ return idfa;
+ }
+
+ public void setIdfa(String idfa)
+ {
+ this.idfa = idfa;
+ }
+
+ public String getImei()
+ {
+ return imei;
+ }
+
+ public void setImei(String imei)
+ {
+ this.imei = imei;
+ }
+
+ public String getMac()
+ {
+ return mac;
+ }
+
+ public void setMac(String mac)
+ {
+ this.mac = mac;
+ }
+
+ public int getMajorVersion()
+ {
+ return majorVersion;
+ }
+
+ public void setMajorVersion(int majorVersion)
+ {
+ this.majorVersion = majorVersion;
+ }
+
+ public int getMinorVersion()
+ {
+ return minorVersion;
+ }
+
+ public void setMinorVersion(int minorVersion)
+ {
+ this.minorVersion = minorVersion;
+ }
+
+ public int getBuildVersion()
+ {
+ return buildVersion;
+ }
+
+ public void setBuildVersion(int buildVersion)
+ {
+ this.buildVersion = buildVersion;
+ }
+
+ public int getOs()
+ {
+ return os;
+ }
+
+ public void setOs(int os)
+ {
+ this.os = os;
+ }
+
+ public String getOsVersion()
+ {
+ return osVersion;
+ }
+
+ public void setOsVersion(String osVersion)
+ {
+ this.osVersion = osVersion;
+ }
+
+ public int getPromoPlatformCode()
+ {
+ return promoPlatformCode;
+ }
+
+ public void setPromoPlatformCode(int promoPlatformCode)
+ {
+ this.promoPlatformCode = promoPlatformCode;
+ }
+
+ public Date getActivationTime()
+ {
+ return activationTime;
+ }
+
+ public void setActivationTime(Date activationTime)
+ {
+ this.activationTime = activationTime;
+ }
+
+ public long getUserId()
+ {
+ return userId;
+ }
+
+ public void setUserId(long userId)
+ {
+ this.userId = userId;
+ }
+
+ public boolean isBound()
+ {
+ return bound;
+ }
+
+ public void setBound(boolean bound)
+ {
+ this.bound = bound;
+ }
+
+ public int[] getJ()
+ {
+ return j;
+ }
+
+ public void setJ(int[] j)
+ {
+ this.j = j;
+ }
+
+ public boolean[] getK()
+ {
+ return k;
+ }
+
+ public void setK(boolean[] k)
+ {
+ this.k = k;
+ }
+
+ public char[] getL()
+ {
+ return l;
+ }
+
+ public void setL(char[] l)
+ {
+ this.l = l;
+ }
+
+ public byte[] getM()
+ {
+ return m;
+ }
+
+ public void setM(byte[] m)
+ {
+ this.m = m;
+ }
+
+ public short[] getN()
+ {
+ return n;
+ }
+
+ public void setN(short[] n)
+ {
+ this.n = n;
+ }
+
+ public long[] getO()
+ {
+ return o;
+ }
+
+ public void setO(long[] o)
+ {
+ this.o = o;
+ }
+
+ public double[] getP()
+ {
+ return p;
+ }
+
+ public void setP(double[] p)
+ {
+ this.p = p;
+ }
+
+ public float[] getQ()
+ {
+ return q;
+ }
+
+ public void setQ(float[] q)
+ {
+ this.q = q;
+ }
+
+ public String[] getR()
+ {
+ return r;
+ }
+
+ public void setR(String[] r)
+ {
+ this.r = r;
+ }
+
+ public int[][] getJ2()
+ {
+ return j2;
+ }
+
+ public void setJ2(int[][] j2)
+ {
+ this.j2 = j2;
+ }
+
+ public boolean[][] getK2()
+ {
+ return k2;
+ }
+
+ public void setK2(boolean[][] k2)
+ {
+ this.k2 = k2;
+ }
+
+ public char[][] getL2()
+ {
+ return l2;
+ }
+
+ public void setL2(char[][] l2)
+ {
+ this.l2 = l2;
+ }
+
+ public byte[][] getM2()
+ {
+ return m2;
+ }
+
+ public void setM2(byte[][] m2)
+ {
+ this.m2 = m2;
+ }
+
+ public short[][] getN2()
+ {
+ return n2;
+ }
+
+ public void setN2(short[][] n2)
+ {
+ this.n2 = n2;
+ }
+
+ public long[][] getO2()
+ {
+ return o2;
+ }
+
+ public void setO2(long[][] o2)
+ {
+ this.o2 = o2;
+ }
+
+ public double[][] getP2()
+ {
+ return p2;
+ }
+
+ public void setP2(double[][] p2)
+ {
+ this.p2 = p2;
+ }
+
+ public float[][] getQ2()
+ {
+ return q2;
+ }
+
+ public void setQ2(float[][] q2)
+ {
+ this.q2 = q2;
+ }
+
+ public String[][] getR2()
+ {
+ return r2;
+ }
+
+ public void setR2(String[][] r2)
+ {
+ this.r2 = r2;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/LongData.java b/src/test/java/org/example/festest/data/LongData.java
new file mode 100644
index 0000000..3455c90
--- /dev/null
+++ b/src/test/java/org/example/festest/data/LongData.java
@@ -0,0 +1,624 @@
+package org.example.festest.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class LongData
+{
+ private int a = 213212312;
+ private boolean b = false;
+ private char c = 'c';
+ private byte d = 0x11;
+ private short e = 24;
+ private long f = 1213124131312321L;
+ private double g = 231321.2132;
+ private float h = (float) 4986.2;
+ private String i = "dzzz";
+ private int[] j = new int[]{1, 2, 4, 5};
+ private boolean[] k = new boolean[]{true, false, true, false, false, false, true};
+ private char[] l = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private byte[] m = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private short[] n = new short[]{3, 8, 213, 451, 312, 45};
+ private long[] o = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private double[] p = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private float[] q = new float[]{46486.2f, 49849.2f, 646854.6f};
+ private String[] r = new String[]{"adasdccczzzzasdasd", "dsadqzzzzzzz2eafsa"};
+ private Integer a1 = 213212312;
+ private Boolean b1 = false;
+ private Character c1 = 'd';
+ private Byte d1 = 0x11;
+ private Short e1 = 24;
+ private Long f1 = 1213124131312321L;
+ private Double g1 = 231321.2132;
+ private Float h1 = (float) 4986.2;
+ private Integer[] j1 = new Integer[]{1, 2, 4, 5};
+ private Boolean[] k1 = new Boolean[]{true, false, true, false, false, false, true};
+ private Character[] l1 = new Character[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private Byte[] m1 = new Byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private Short[] n1 = new Short[]{3, 8, 213, 451, 312, 45};
+ private Long[] o1 = new Long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private Double[] p1 = new Double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private Float[] q1 = new Float[]{46486.2f, 49849.2f, 646854.6f};
+ private int[][] w = new int[][]{{1, 2}, {3, 4, 5}};
+ private List list = new ArrayList();
+ private HashMap map = new HashMap();
+ private Object j2 = new int[]{1, 2, 4, 5};
+ private Object k2 = new boolean[]{true, false, true, false, false, false, true};
+ private Object l2 = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private Object m2 = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private Object n2 = new short[]{3, 8, 213, 451, 312, 45};
+ private Object o2 = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private Object p2 = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private Object q2 = new float[]{46486.2f, 49849.2f, 646854.6f};
+ private Object r2 = new String[]{"adasdasccccccccccccccdasd", "dsadq2eccccccccafsa"};
+ private Object j3 = new Integer[]{1, 2, 4, 5};
+ private Object k3 = new Boolean[]{true, false, true, false, false, false, true};
+ private Object l3 = new Character[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private Object m3 = new Byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private Object n3 = new Short[]{3, 8, 213, 451, 312, 45};
+ private Object o3 = new Long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private Double[] p3 = new Double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private Float[] q3 = new Float[]{46486.2f, 49849.2f, 646854.6f};
+ private int[][] w3 = new int[][]{{1, 2}, {3, 4, 5}};
+
+ // private BaseData baseData = new BaseData();
+ public LongData()
+ {
+ for (int i = 0; i < 4; i++)
+ {
+ list.add(new BaseData(i));
+ map.put(i, new BaseData(i + 11));
+ }
+ }
+
+ public int getA()
+ {
+ return a;
+ }
+
+ public void setA(int a)
+ {
+ this.a = a;
+ }
+
+ public boolean isB()
+ {
+ return b;
+ }
+
+ public void setB(boolean b)
+ {
+ this.b = b;
+ }
+
+ public char getC()
+ {
+ return c;
+ }
+
+ public void setC(char c)
+ {
+ this.c = c;
+ }
+
+ public byte getD()
+ {
+ return d;
+ }
+
+ public void setD(byte d)
+ {
+ this.d = d;
+ }
+
+ public short getE()
+ {
+ return e;
+ }
+
+ public void setE(short e)
+ {
+ this.e = e;
+ }
+
+ public long getF()
+ {
+ return f;
+ }
+
+ public void setF(long f)
+ {
+ this.f = f;
+ }
+
+ public double getG()
+ {
+ return g;
+ }
+
+ public void setG(double g)
+ {
+ this.g = g;
+ }
+
+ public float getH()
+ {
+ return h;
+ }
+
+ public void setH(float h)
+ {
+ this.h = h;
+ }
+
+ public String getI()
+ {
+ return i;
+ }
+
+ public void setI(String i)
+ {
+ this.i = i;
+ }
+
+ public int[] getJ()
+ {
+ return j;
+ }
+
+ public void setJ(int[] j)
+ {
+ this.j = j;
+ }
+
+ public boolean[] getK()
+ {
+ return k;
+ }
+
+ public void setK(boolean[] k)
+ {
+ this.k = k;
+ }
+
+ public char[] getL()
+ {
+ return l;
+ }
+
+ public void setL(char[] l)
+ {
+ this.l = l;
+ }
+
+ public byte[] getM()
+ {
+ return m;
+ }
+
+ public void setM(byte[] m)
+ {
+ this.m = m;
+ }
+
+ public short[] getN()
+ {
+ return n;
+ }
+
+ public void setN(short[] n)
+ {
+ this.n = n;
+ }
+
+ public long[] getO()
+ {
+ return o;
+ }
+
+ public void setO(long[] o)
+ {
+ this.o = o;
+ }
+
+ public double[] getP()
+ {
+ return p;
+ }
+
+ public void setP(double[] p)
+ {
+ this.p = p;
+ }
+
+ public float[] getQ()
+ {
+ return q;
+ }
+
+ public void setQ(float[] q)
+ {
+ this.q = q;
+ }
+
+ public String[] getR()
+ {
+ return r;
+ }
+
+ public void setR(String[] r)
+ {
+ this.r = r;
+ }
+
+ public Integer getA1()
+ {
+ return a1;
+ }
+
+ public void setA1(Integer a1)
+ {
+ this.a1 = a1;
+ }
+
+ public Boolean getB1()
+ {
+ return b1;
+ }
+
+ public void setB1(Boolean b1)
+ {
+ this.b1 = b1;
+ }
+
+ public Character getC1()
+ {
+ return c1;
+ }
+
+ public void setC1(Character c1)
+ {
+ this.c1 = c1;
+ }
+
+ public Byte getD1()
+ {
+ return d1;
+ }
+
+ public void setD1(Byte d1)
+ {
+ this.d1 = d1;
+ }
+
+ public Short getE1()
+ {
+ return e1;
+ }
+
+ public void setE1(Short e1)
+ {
+ this.e1 = e1;
+ }
+
+ public Long getF1()
+ {
+ return f1;
+ }
+
+ public void setF1(Long f1)
+ {
+ this.f1 = f1;
+ }
+
+ public Double getG1()
+ {
+ return g1;
+ }
+
+ public void setG1(Double g1)
+ {
+ this.g1 = g1;
+ }
+
+ public Float getH1()
+ {
+ return h1;
+ }
+
+ public void setH1(Float h1)
+ {
+ this.h1 = h1;
+ }
+
+ public Integer[] getJ1()
+ {
+ return j1;
+ }
+
+ public void setJ1(Integer[] j1)
+ {
+ this.j1 = j1;
+ }
+
+ public Boolean[] getK1()
+ {
+ return k1;
+ }
+
+ public void setK1(Boolean[] k1)
+ {
+ this.k1 = k1;
+ }
+
+ public Character[] getL1()
+ {
+ return l1;
+ }
+
+ public void setL1(Character[] l1)
+ {
+ this.l1 = l1;
+ }
+
+ public Byte[] getM1()
+ {
+ return m1;
+ }
+
+ public void setM1(Byte[] m1)
+ {
+ this.m1 = m1;
+ }
+
+ public Short[] getN1()
+ {
+ return n1;
+ }
+
+ public void setN1(Short[] n1)
+ {
+ this.n1 = n1;
+ }
+
+ public Long[] getO1()
+ {
+ return o1;
+ }
+
+ public void setO1(Long[] o1)
+ {
+ this.o1 = o1;
+ }
+
+ public Double[] getP1()
+ {
+ return p1;
+ }
+
+ public void setP1(Double[] p1)
+ {
+ this.p1 = p1;
+ }
+
+ public Float[] getQ1()
+ {
+ return q1;
+ }
+
+ public void setQ1(Float[] q1)
+ {
+ this.q1 = q1;
+ }
+
+ public int[][] getW()
+ {
+ return w;
+ }
+
+ public void setW(int[][] w)
+ {
+ this.w = w;
+ }
+
+ public List getList()
+ {
+ return list;
+ }
+
+ public void setList(List list)
+ {
+ this.list = list;
+ }
+
+ public HashMap getMap()
+ {
+ return map;
+ }
+
+ public void setMap(HashMap map)
+ {
+ this.map = map;
+ }
+
+ public Object getJ2()
+ {
+ return j2;
+ }
+
+ public void setJ2(Object j2)
+ {
+ this.j2 = j2;
+ }
+
+ public Object getK2()
+ {
+ return k2;
+ }
+
+ public void setK2(Object k2)
+ {
+ this.k2 = k2;
+ }
+
+ public Object getL2()
+ {
+ return l2;
+ }
+
+ public void setL2(Object l2)
+ {
+ this.l2 = l2;
+ }
+
+ public Object getM2()
+ {
+ return m2;
+ }
+
+ public void setM2(Object m2)
+ {
+ this.m2 = m2;
+ }
+
+ public Object getN2()
+ {
+ return n2;
+ }
+
+ public void setN2(Object n2)
+ {
+ this.n2 = n2;
+ }
+
+ public Object getO2()
+ {
+ return o2;
+ }
+
+ public void setO2(Object o2)
+ {
+ this.o2 = o2;
+ }
+
+ public Object getP2()
+ {
+ return p2;
+ }
+
+ public void setP2(Object p2)
+ {
+ this.p2 = p2;
+ }
+
+ public Object getQ2()
+ {
+ return q2;
+ }
+
+ public void setQ2(Object q2)
+ {
+ this.q2 = q2;
+ }
+
+ public Object getR2()
+ {
+ return r2;
+ }
+
+ public void setR2(Object r2)
+ {
+ this.r2 = r2;
+ }
+
+ public Object getJ3()
+ {
+ return j3;
+ }
+
+ public void setJ3(Object j3)
+ {
+ this.j3 = j3;
+ }
+
+ public Object getK3()
+ {
+ return k3;
+ }
+
+ public void setK3(Object k3)
+ {
+ this.k3 = k3;
+ }
+
+ public Object getL3()
+ {
+ return l3;
+ }
+
+ public void setL3(Object l3)
+ {
+ this.l3 = l3;
+ }
+
+ public Object getM3()
+ {
+ return m3;
+ }
+
+ public void setM3(Object m3)
+ {
+ this.m3 = m3;
+ }
+
+ public Object getN3()
+ {
+ return n3;
+ }
+
+ public void setN3(Object n3)
+ {
+ this.n3 = n3;
+ }
+
+ public Object getO3()
+ {
+ return o3;
+ }
+
+ public void setO3(Object o3)
+ {
+ this.o3 = o3;
+ }
+
+ public Double[] getP3()
+ {
+ return p3;
+ }
+
+ public void setP3(Double[] p3)
+ {
+ this.p3 = p3;
+ }
+
+ public Float[] getQ3()
+ {
+ return q3;
+ }
+
+ public void setQ3(Float[] q3)
+ {
+ this.q3 = q3;
+ }
+
+ public int[][] getW3()
+ {
+ return w3;
+ }
+
+ public void setW3(int[][] w3)
+ {
+ this.w3 = w3;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/NewBaseData.java b/src/test/java/org/example/festest/data/NewBaseData.java
new file mode 100644
index 0000000..d79629a
--- /dev/null
+++ b/src/test/java/org/example/festest/data/NewBaseData.java
@@ -0,0 +1,117 @@
+package org.example.festest.data;
+
+public class NewBaseData
+{
+ public int a = 213212312;
+ private int index = 0;
+ private boolean b = false;
+ private char c = 'c';
+ private byte d = 0x11;
+ private short e = 24;
+ private long f = 1213124131312321L;
+ private double g = 231321.2132;
+ private float h = (float) 4986.2;
+ private String i = "123452312316789a";
+ private int[] j = new int[]{1, 2, 4, 5};
+ private boolean[] k = new boolean[]{true, false, true, false, false, false, true};
+
+ public int getIndex()
+ {
+ return index;
+ }
+
+ public void setIndex(int index)
+ {
+ this.index = index;
+ }
+
+ public int getA()
+ {
+ return a;
+ }
+
+ public void setA(int a)
+ {
+ this.a = a;
+ }
+
+ public boolean isB()
+ {
+ return b;
+ }
+
+ public void setB(boolean b)
+ {
+ this.b = b;
+ }
+
+ public char getC()
+ {
+ return c;
+ }
+
+ public void setC(char c)
+ {
+ this.c = c;
+ }
+
+ public byte getD()
+ {
+ return d;
+ }
+
+ public void setD(byte d)
+ {
+ this.d = d;
+ }
+
+ public short getE()
+ {
+ return e;
+ }
+
+ public void setE(short e)
+ {
+ this.e = e;
+ }
+
+ public long getF()
+ {
+ return f;
+ }
+
+ public void setF(long f)
+ {
+ this.f = f;
+ }
+
+ public double getG()
+ {
+ return g;
+ }
+
+ public void setG(double g)
+ {
+ this.g = g;
+ }
+
+ public float getH()
+ {
+ return h;
+ }
+
+ public void setH(float h)
+ {
+ this.h = h;
+ }
+
+ public String getI()
+ {
+ return i;
+ }
+
+ public void setI(String i)
+ {
+ this.i = i;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/Person.java b/src/test/java/org/example/festest/data/Person.java
new file mode 100644
index 0000000..07a070c
--- /dev/null
+++ b/src/test/java/org/example/festest/data/Person.java
@@ -0,0 +1,128 @@
+package org.example.festest.data;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.util.*;
+
+public class Person implements Serializable
+{
+ public String name;
+ public int age = 56;
+ public Person leader;
+ private List list = new ArrayList();
+ private Map map = new HashMap();
+ private int[][] w = new int[][]{{1, 2}, {3, 4, 5}};
+ private Date date = new Date();
+
+ public Person()
+ {
+ this("linbin", 25);
+ }
+
+ public Person(String name, int age)
+ {
+ for (int i = 0; i < 10; i++)
+ {
+ list.add(new BaseData(i));
+ map.put(i, new BaseData(i + 30));
+ }
+ this.name = name;
+ this.age = age;
+ }
+
+ public static void main(String args[]) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException
+ {
+ Field w = Person.class.getDeclaredField("w");
+ Person.class.getDeclaredMethod("setW",w.getType());
+ }
+
+ public boolean equals(Object target)
+ {
+ if (target instanceof Person)
+ {
+ Person person = (Person) target;
+ if (name.equals(person.getName()) && age == person.getAge() && date.equals(person.getDate()) && list.equals(person.getList()) && map.equals(person.getMap()))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public List getList()
+ {
+ return list;
+ }
+
+ public void setList(List list)
+ {
+ this.list = list;
+ }
+
+ public Map getMap()
+ {
+ return map;
+ }
+
+ public void setMap(Map map)
+ {
+ this.map = map;
+ }
+
+ public int[][] getW()
+ {
+ return w;
+ }
+
+ public void setW(int[][] w)
+ {
+ this.w = w;
+ }
+
+ public Date getDate()
+ {
+ return date;
+ }
+
+ public void setDate(Date date)
+ {
+ this.date = date;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public Integer getAge()
+ {
+ return age;
+ }
+
+ public void setAge(int age)
+ {
+ this.age = age;
+ }
+
+ public Person getLeader()
+ {
+ return leader;
+ }
+
+ public void setLeader(Person leader)
+ {
+ this.leader = leader;
+ }
+}
diff --git a/src/test/java/org/example/festest/data/SpeedData.java b/src/test/java/org/example/festest/data/SpeedData.java
new file mode 100644
index 0000000..1042f48
--- /dev/null
+++ b/src/test/java/org/example/festest/data/SpeedData.java
@@ -0,0 +1,48 @@
+package org.example.festest.data;
+
+import org.example.festest.RandomString;
+
+import java.util.Date;
+
+public class SpeedData
+{
+ public int a = 213212312;
+ private Date[] dates = new Date[]{new Date(13536156), new Date(54454655)};
+ private int index = 0;
+ private boolean b = false;
+ private char c = 'c';
+ private byte d = 0x11;
+ private short e = 24;
+ private long f = 1213124131312321L;
+ private double g = 231321.2132;
+ private float h = (float) 4986.2;
+ private String i = RandomString.randomString(15);
+ private int[] j = new int[]{1, 2, 4, 5};
+ private boolean[] k = new boolean[]{true, false, true, false, false, false, true};
+ private char[] l = new char[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private byte[] m = new byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private short[] n = new short[]{3, 8, 213, 451, 312, 45};
+ private long[] o = new long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private double[] p = new double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private float[] q = new float[]{46486.2f, 49849.2f, 646854.6f};
+ private String[] r = new String[] { "abcdf12345", "abdfcgf12323" };
+ private int[][] j2 = new int[][] { { 1, 2, 4, 5 }, { 1, 2, 3, 4, 5, 6 } };
+ private boolean[][] k2 = new boolean[][] { { true, false, true, false, false, false, true }, { true, false, true, false, false, false, false } };
+ private char[][] l2 = new char[][] { { 'a', 'v', 'q', 'j', 'h', 'e', 'f' }, { 'a', 'v', 'q', 'j', 'h', 'e', 'f' } };
+ private byte[][] m2 = new byte[][] { { 0x32, 0x12, 0x34, (byte) 0x96 }, { 0x32, 0x12, 0x34, (byte) 0x96 } };
+ private short[][] n2 = new short[][] { { 3, 8, 213, 451, 312, 45 }, { 3, 8, 213, 451, 312, 45 } };
+ private long[][] o2 = new long[][] { { 12313131313l, 524141431313l, 3131231231425l, 1313123121l }, { 12313131313l, 524141431313l, 3131231231425l, 1313123121l } };
+ private double[][] p2 = new double[][] { { 6468613646.48646d, 4646.456d, 546864648867.466d }, { 6468613646.48646d, 4646.456d, 546864648867.466d } };
+ private float[][] q2 = new float[][] { { 46486.2f, 49849.2f, 646854.6f }, { 46486.2f, 49849.2f, 646854.6f } };
+ private String[][] r2 = new String[2][];
+//
+ private Object j1 = new int[] { 1, 2, 4, 5 };
+ private Object k1 = new boolean[] { true, false, true, false, false, false, true };
+ private Object l1 = new char[] { 'a', 'v', 'q', 'j', 'h', 'e', 'f' };
+ private Object m1 = new byte[] { 0x32, 0x12, 0x34, (byte) 0x96 };
+ private Object n1 = new short[] { 3, 8, 213, 451, 312, 45 };
+ private Object o1 = new long[] { 12313131313l, 524141431313l, 3131231231425l, 1313123121l };
+ private Object p1 = new double[] { 6468613646.48646d, 4646.456d, 546864648867.466d };
+ private Object q1 = new float[] { 46486.2f, 49849.2f, 646854.6f };
+ private Object r1 = new String[] { "adas122林斌eqeddasdasd", "dsadqeq2eafsa" };
+}
diff --git a/src/test/java/org/example/festest/data/SpeedData2.java b/src/test/java/org/example/festest/data/SpeedData2.java
new file mode 100644
index 0000000..a21802b
--- /dev/null
+++ b/src/test/java/org/example/festest/data/SpeedData2.java
@@ -0,0 +1,46 @@
+package org.example.festest.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class SpeedData2
+{
+ // private Integer a = 213212312;
+ // private Boolean b = true;
+ // private Character c = 'd';
+ // private Byte d = 0x11;
+ // private Short e = 24;
+ // private Long f = 1213124131312321L;
+ // private Double g = 231321.2132;
+ // private Float h = (float) 4986.2;
+ // private Date i = new Date(466846979467694l);
+ // private Integer[] j = new Integer[] { 1, 2, 4, 5 };
+ // private Boolean[] k = new Boolean[] { true, false, true, false, false,
+ // false, true };
+ // private Character[] l = new Character[] { 'a', 'v', 'q', 'j', 'h', 'e',
+ // 'f' };
+ // private Byte[] m = new Byte[] { 0x32, 0x12, 0x34, (byte) 0x96 };
+ // private Short[] n = new Short[] { 3, 8, 213, 451, 312, 45 };
+ // private Long[] o = new Long[] { 12313131313l, 524141431313l,
+ // 3131231231425l, 1313123121l };
+ // private Double[] p = new Double[] { 6468613646.48646d, 4646.456d,
+ // 546864648867.466d };
+ // private Float[] q = new Float[] { 46486.2f, 49849.2f, 646854.6f };
+ // private Date[] r = new Date[] { new Date(4646876464684l), new
+ // Date(231323123121l) };
+ // private int[][] w = new int[][] { { 1, 2 }, { 3, 4, 5 } };
+ private List list = new ArrayList();
+ private HashMap map = new HashMap();
+ // private SpeedData speedData = new SpeedData();
+
+ public SpeedData2()
+ {
+ for (int i = 0; i < 20; i++)
+ {
+ SpeedData baseData = new SpeedData();
+ list.add(baseData);
+// map.put(i, baseData);
+ }
+ }
+}
diff --git a/src/test/java/org/example/festest/data/WrapData.java b/src/test/java/org/example/festest/data/WrapData.java
new file mode 100644
index 0000000..5a1c0f8
--- /dev/null
+++ b/src/test/java/org/example/festest/data/WrapData.java
@@ -0,0 +1,248 @@
+package org.example.festest.data;
+
+import java.util.*;
+
+public class WrapData
+{
+ private Integer a = 213212312;
+ private Boolean b = true;
+ private Character c = 'd';
+ private Byte d = 0x11;
+ private Short e = 24;
+ private Long f = 1213124131312321L;
+ private Double g = 231321.2132;
+ private Float h = (float) 4986.2;
+ private Date i = new Date(466846979467694l);
+ private Integer[] j = new Integer[]{1, 2, 4, 5};
+ private Boolean[] k = new Boolean[]{true, false, true, false, false, false, true};
+ private Character[] l = new Character[]{'a', 'v', 'q', 'j', 'h', 'e', 'f'};
+ private Byte[] m = new Byte[]{0x32, 0x12, 0x34, (byte) 0x96};
+ private Short[] n = new Short[]{3, 8, 213, 451, 312, 45};
+ private Long[] o = new Long[]{12313131313l, 524141431313l, 3131231231425l, 1313123121l};
+ private Double[] p = new Double[]{6468613646.48646d, 4646.456d, 546864648867.466d};
+ private Float[] q = new Float[]{46486.2f, 49849.2f, 646854.6f};
+ private Date[] r = new Date[]{new Date(4646876464684l), new Date(231323123121l)};
+ private int[][] w = new int[][]{{1, 2}, {3, 4, 5}};
+ private List list = new ArrayList();
+ private HashMap map = new HashMap();
+
+ public WrapData()
+ {
+ for (int i = 0; i < 2; i++)
+ {
+ BaseData baseData = new BaseData(i);
+ list.add(baseData);
+// map.put(i, baseData);
+ }
+ }
+
+ public Integer getA()
+ {
+ return a;
+ }
+
+ public void setA(Integer a)
+ {
+ this.a = a;
+ }
+
+ public Boolean getB()
+ {
+ return b;
+ }
+
+ public void setB(Boolean b)
+ {
+ this.b = b;
+ }
+
+ public Character getC()
+ {
+ return c;
+ }
+
+ public void setC(Character c)
+ {
+ this.c = c;
+ }
+
+ public Byte getD()
+ {
+ return d;
+ }
+
+ public void setD(Byte d)
+ {
+ this.d = d;
+ }
+
+ public Short getE()
+ {
+ return e;
+ }
+
+ public void setE(Short e)
+ {
+ this.e = e;
+ }
+
+ public Long getF()
+ {
+ return f;
+ }
+
+ public void setF(Long f)
+ {
+ this.f = f;
+ }
+
+ public Double getG()
+ {
+ return g;
+ }
+
+ public void setG(Double g)
+ {
+ this.g = g;
+ }
+
+ public Float getH()
+ {
+ return h;
+ }
+
+ public void setH(Float h)
+ {
+ this.h = h;
+ }
+
+ public Date getI()
+ {
+ return i;
+ }
+
+ public void setI(Date i)
+ {
+ this.i = i;
+ }
+
+ public Integer[] getJ()
+ {
+ return j;
+ }
+
+ public void setJ(Integer[] j)
+ {
+ this.j = j;
+ }
+
+ public Boolean[] getK()
+ {
+ return k;
+ }
+
+ public void setK(Boolean[] k)
+ {
+ this.k = k;
+ }
+
+ public Character[] getL()
+ {
+ return l;
+ }
+
+ public void setL(Character[] l)
+ {
+ this.l = l;
+ }
+
+ public Byte[] getM()
+ {
+ return m;
+ }
+
+ public void setM(Byte[] m)
+ {
+ this.m = m;
+ }
+
+ public Short[] getN()
+ {
+ return n;
+ }
+
+ public void setN(Short[] n)
+ {
+ this.n = n;
+ }
+
+ public Long[] getO()
+ {
+ return o;
+ }
+
+ public void setO(Long[] o)
+ {
+ this.o = o;
+ }
+
+ public Double[] getP()
+ {
+ return p;
+ }
+
+ public void setP(Double[] p)
+ {
+ this.p = p;
+ }
+
+ public Float[] getQ()
+ {
+ return q;
+ }
+
+ public void setQ(Float[] q)
+ {
+ this.q = q;
+ }
+
+ public Date[] getR()
+ {
+ return r;
+ }
+
+ public void setR(Date[] r)
+ {
+ this.r = r;
+ }
+
+ public int[][] getW()
+ {
+ return w;
+ }
+
+ public void setW(int[][] w)
+ {
+ this.w = w;
+ }
+
+ public List getList()
+ {
+ return list;
+ }
+
+ public void setList(List list)
+ {
+ this.list = list;
+ }
+
+ public Map getMap()
+ {
+ return map;
+ }
+
+ public void setMap(HashMap map)
+ {
+ this.map = map;
+ }
+}
diff --git a/src/test/resources/log4j2.xml b/src/test/resources/log4j2.xml
new file mode 100644
index 0000000..d56d498
--- /dev/null
+++ b/src/test/resources/log4j2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file