Package org.mapdb.elsa
Class ElsaSerializerPojo
- java.lang.Object
-
- org.mapdb.elsa.ElsaSerializerBase
-
- org.mapdb.elsa.ElsaSerializerPojo
-
- All Implemented Interfaces:
java.io.Serializable,ElsaSerializer
public class ElsaSerializerPojo extends ElsaSerializerBase implements java.io.Serializable
Advanced Elsa Serializer. On top of well known objects from
TODO more javadocElsaSerializerBase, it can serialize any class by analyzing its fields.- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classElsaSerializerPojo.ClassInfoStores info about single class stored in MapDB.static classElsaSerializerPojo.FieldInfoStores info about single field stored in MapDB.-
Nested classes/interfaces inherited from class org.mapdb.elsa.ElsaSerializerBase
ElsaSerializerBase.Deserializer<A>, ElsaSerializerBase.DeserInt, ElsaSerializerBase.DeserLong, ElsaSerializerBase.DeserSingleton, ElsaSerializerBase.DeserStringLen, ElsaSerializerBase.Header, ElsaSerializerBase.Serializer<A>, ElsaSerializerBase.UserSerializer
-
-
Field Summary
Fields Modifier and Type Field Description protected static java.lang.reflect.MethodandroidConstructorprivate static java.lang.reflect.MethodandroidConstructorGingerprivate static java.lang.reflect.MethodandroidConstructorJellyprotected static java.util.Map<java.lang.Class<?>,java.lang.reflect.Constructor<?>>class2constuctorprotected static java.util.Map<java.lang.Class,ElsaSerializerPojo.ClassInfo>classInfoCacheprotected ElsaClassInfoResolverclassInfoResolverprivate static java.lang.ObjectconstructorIdprivate static java.util.logging.LoggerLOGprotected ElsaClassCallbackmissingClassNotificationprivate static longserialVersionUIDprotected static java.lang.reflect.MethodsunConstructorprotected static java.lang.ObjectsunReflFac-
Fields inherited from class org.mapdb.elsa.ElsaSerializerBase
classCache, classLoader, DESER_BYTE_ARRAY, headerDeser, objectStackType, ser, SER_BOOLEAN, SER_BYTE, SER_BYTE_ARRAY, SER_CHAR, SER_DOUBLE, SER_FLOAT, SER_INT, SER_INT_ARRAY, SER_LONG, SER_LONG_ARRAY, SER_SHORT, SER_STRING, singletons, singletonsReverse, userDeser
-
-
Constructor Summary
Constructors Constructor Description ElsaSerializerPojo()ElsaSerializerPojo(java.lang.ClassLoader classLoader, int objectStackType, java.lang.Object[] singletons, java.util.Map<java.lang.Class,ElsaSerializerBase.Serializer> userSer, java.util.Map<java.lang.Class,java.lang.Integer> userSerHeaders, java.util.Map<java.lang.Integer,ElsaSerializerBase.Deserializer> userDeser, ElsaClassCallback missingClassNotification, ElsaClassInfoResolver classInfoResolver)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidassertClassSerializable(java.lang.Class<?> clazz)protected static java.lang.ClassclassForName(java.lang.String className, java.lang.ClassLoader loader)ElsaSerializerPojo.ClassInfoclassInfoDeserialize(java.io.DataInput in)voidclassInfoSerialize(java.io.DataOutput out, ElsaSerializerPojo.ClassInfo ci)intclassToId(java.lang.String className)protected <T> TcreateInstanceSkippinkConstructor(java.lang.Class<T> clazz)For pojo serialization we need to instantiate class without invoking its constructor.protected java.lang.ObjectdeserializeUnknownHeader(java.io.DataInput in, int head, ElsaStack objectStack)override this method to extend ElsaSerializerBase functionalityprotected java.io.ObjectStreamField[]fieldsForClass(java.lang.Class<?> clazz)protected ElsaSerializerPojo.ClassInfogetClassInfo(int classId)java.lang.ObjectgetFieldValue(ElsaSerializerPojo.FieldInfo fieldInfo, java.lang.Object object)booleanisSerializable(java.lang.Object o)Checks if given object is known to Elsa.private static java.lang.ClassloadClassStaticUnchecked(java.lang.String name, java.lang.ClassLoader classLoader)static ElsaSerializerPojo.ClassInfomakeClassInfo(java.lang.Class clazz, java.lang.ClassLoader classLoader)protected static ElsaSerializerPojo.ClassInfomakeClassInfo2(java.lang.Class clazz, java.lang.ClassLoader classLoader)private static java.io.ObjectStreamField[]makeFieldsForClass(java.lang.Class<?> clazz)protected voidnotifyMissingClassInfo(java.lang.Class className)protected voidserializeUnknownObject(java.io.DataOutput out, java.lang.Object obj, ElsaStack objectStack)override this method to extend ElsaSerializerBase functionalityvoidsetFieldValue(ElsaSerializerPojo.FieldInfo fieldInfo, java.lang.Object object, java.lang.Object value)protected static booleanuseJavaSerialization(java.lang.Class<?> clazz)if class uses 'Java Serialization' trick such as `Externalizable`, `writeObject`, `writeReplace`...private java.io.InputStreamwrapStream(java.io.DataInput in)-
Methods inherited from class org.mapdb.elsa.ElsaSerializerBase
clone, defaultClassLoaderIfNull, deserialize, deserialize, deserializeSingleton, deserializeString, initHeaderDeser, initSer, loadClassCached, loadClassCached, loadClassCachedUnchecked, newElsaStack, readBooleanArray, serialize, serialize, serializeClass, serializeObjectArray, writeBooleanArray
-
-
-
-
Field Detail
-
LOG
private static final java.util.logging.Logger LOG
-
missingClassNotification
protected final ElsaClassCallback missingClassNotification
-
classInfoResolver
protected final ElsaClassInfoResolver classInfoResolver
-
serialVersionUID
private static final long serialVersionUID
- See Also:
- Constant Field Values
-
classInfoCache
protected static java.util.Map<java.lang.Class,ElsaSerializerPojo.ClassInfo> classInfoCache
-
sunConstructor
protected static java.lang.reflect.Method sunConstructor
-
sunReflFac
protected static java.lang.Object sunReflFac
-
androidConstructor
protected static java.lang.reflect.Method androidConstructor
-
androidConstructorGinger
private static java.lang.reflect.Method androidConstructorGinger
-
androidConstructorJelly
private static java.lang.reflect.Method androidConstructorJelly
-
constructorId
private static java.lang.Object constructorId
-
class2constuctor
protected static java.util.Map<java.lang.Class<?>,java.lang.reflect.Constructor<?>> class2constuctor
-
-
Constructor Detail
-
ElsaSerializerPojo
public ElsaSerializerPojo()
-
ElsaSerializerPojo
public ElsaSerializerPojo(java.lang.ClassLoader classLoader, int objectStackType, java.lang.Object[] singletons, java.util.Map<java.lang.Class,ElsaSerializerBase.Serializer> userSer, java.util.Map<java.lang.Class,java.lang.Integer> userSerHeaders, java.util.Map<java.lang.Integer,ElsaSerializerBase.Deserializer> userDeser, ElsaClassCallback missingClassNotification, ElsaClassInfoResolver classInfoResolver)
-
-
Method Detail
-
classInfoSerialize
public void classInfoSerialize(java.io.DataOutput out, ElsaSerializerPojo.ClassInfo ci) throws java.io.IOException- Throws:
java.io.IOException
-
classInfoDeserialize
public ElsaSerializerPojo.ClassInfo classInfoDeserialize(java.io.DataInput in) throws java.io.IOException
- Throws:
java.io.IOException
-
classForName
protected static java.lang.Class classForName(java.lang.String className, java.lang.ClassLoader loader)
-
getClassInfo
protected ElsaSerializerPojo.ClassInfo getClassInfo(int classId)
-
notifyMissingClassInfo
protected void notifyMissingClassInfo(java.lang.Class className)
-
makeClassInfo
public static ElsaSerializerPojo.ClassInfo makeClassInfo(java.lang.Class clazz, java.lang.ClassLoader classLoader)
-
makeClassInfo2
protected static ElsaSerializerPojo.ClassInfo makeClassInfo2(java.lang.Class clazz, java.lang.ClassLoader classLoader)
-
useJavaSerialization
protected static boolean useJavaSerialization(java.lang.Class<?> clazz)
if class uses 'Java Serialization' trick such as `Externalizable`, `writeObject`, `writeReplace`... Elsa will useObjectOutputStreamto serialize it.- Parameters:
clazz- class to be checked for serializatio tricks- Returns:
- true if Java Serialization should be used to serialize it
-
fieldsForClass
protected java.io.ObjectStreamField[] fieldsForClass(java.lang.Class<?> clazz)
-
makeFieldsForClass
private static java.io.ObjectStreamField[] makeFieldsForClass(java.lang.Class<?> clazz)
-
isSerializable
public boolean isSerializable(java.lang.Object o)
Description copied from class:ElsaSerializerBaseChecks if given object is known to Elsa. If false is returned, Elsa will use less efficient field serializer.- Overrides:
isSerializablein classElsaSerializerBase- Parameters:
o- object to be checked- Returns:
- true if mapdb knows howto serialize given object
-
assertClassSerializable
protected void assertClassSerializable(java.lang.Class<?> clazz) throws java.io.NotSerializableException, java.io.InvalidClassException- Throws:
java.io.NotSerializableExceptionjava.io.InvalidClassException
-
getFieldValue
public java.lang.Object getFieldValue(ElsaSerializerPojo.FieldInfo fieldInfo, java.lang.Object object)
-
setFieldValue
public void setFieldValue(ElsaSerializerPojo.FieldInfo fieldInfo, java.lang.Object object, java.lang.Object value)
-
classToId
public int classToId(java.lang.String className)
-
serializeUnknownObject
protected void serializeUnknownObject(java.io.DataOutput out, java.lang.Object obj, ElsaStack objectStack) throws java.io.IOExceptionDescription copied from class:ElsaSerializerBaseoverride this method to extend ElsaSerializerBase functionality- Overrides:
serializeUnknownObjectin classElsaSerializerBase- Parameters:
out- put binary data hereobj- object to be serializedobjectStack- objectStack for handling backward references- Throws:
java.io.IOException- an exception from underlying stream
-
deserializeUnknownHeader
protected java.lang.Object deserializeUnknownHeader(java.io.DataInput in, int head, ElsaStack objectStack) throws java.io.IOExceptionDescription copied from class:ElsaSerializerBaseoverride this method to extend ElsaSerializerBase functionality- Overrides:
deserializeUnknownHeaderin classElsaSerializerBase- Parameters:
in- read binary data from herehead- binary header read from input streamobjectStack- objectStack for handling backward references- Returns:
- deserialized object
- Throws:
java.io.IOException- an exception from underlying stream
-
wrapStream
private java.io.InputStream wrapStream(java.io.DataInput in) throws java.io.IOException- Throws:
java.io.IOException
-
loadClassStaticUnchecked
private static java.lang.Class loadClassStaticUnchecked(java.lang.String name, java.lang.ClassLoader classLoader)
-
createInstanceSkippinkConstructor
protected <T> T createInstanceSkippinkConstructor(java.lang.Class<T> clazz)
For pojo serialization we need to instantiate class without invoking its constructor. There are two ways to do it:
Using proprietary API on Oracle JDK and OpenJDK sun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization() more at http://www.javaspecialists.eu/archive/Issue175.html
Using
ObjectInputStream.newInstanceon Android http://stackoverflow.com/a/3448384If non of these works we fallback into usual reflection which requires an no-arg constructor
- Type Parameters:
T- type of object- Parameters:
clazz- class of object- Returns:
- instantiated object
-
-