Package org.mapdb.elsa
Class ElsaSerializerPojo
java.lang.Object
org.mapdb.elsa.ElsaSerializerBase
org.mapdb.elsa.ElsaSerializerPojo
- All Implemented Interfaces:
Serializable,ElsaSerializer
Advanced Elsa Serializer.
On top of well known objects from ElsaSerializerBase,
it can serialize any class by analyzing its fields.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final classStores info about single class stored in MapDB.static classStores 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
FieldsModifier and TypeFieldDescriptionprotected static Methodprivate static Methodprivate static Methodprotected static Map<Class<?>, Constructor<?>> protected static Map<Class, ElsaSerializerPojo.ClassInfo> protected final ElsaClassInfoResolverprivate static Objectprivate static final Loggerprotected final ElsaClassCallbackprivate static final longprotected static Methodprotected static ObjectFields 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
ConstructorsConstructorDescriptionElsaSerializerPojo(ClassLoader classLoader, int objectStackType, Object[] singletons, Map<Class, ElsaSerializerBase.Serializer> userSer, Map<Class, Integer> userSerHeaders, Map<Integer, ElsaSerializerBase.Deserializer> userDeser, ElsaClassCallback missingClassNotification, ElsaClassInfoResolver classInfoResolver) -
Method Summary
Modifier and TypeMethodDescriptionprotected voidassertClassSerializable(Class<?> clazz) protected static ClassclassForName(String className, ClassLoader loader) voidintprotected <T> TcreateInstanceSkippinkConstructor(Class<T> clazz) For pojo serialization we need to instantiate class without invoking its constructor.protected ObjectdeserializeUnknownHeader(DataInput in, int head, ElsaStack objectStack) override this method to extend ElsaSerializerBase functionalityprotected ObjectStreamField[]fieldsForClass(Class<?> clazz) protected ElsaSerializerPojo.ClassInfogetClassInfo(int classId) getFieldValue(ElsaSerializerPojo.FieldInfo fieldInfo, Object object) booleanChecks if given object is known to Elsa.private static ClassloadClassStaticUnchecked(String name, ClassLoader classLoader) static ElsaSerializerPojo.ClassInfomakeClassInfo(Class clazz, ClassLoader classLoader) protected static ElsaSerializerPojo.ClassInfomakeClassInfo2(Class clazz, ClassLoader classLoader) private static ObjectStreamField[]makeFieldsForClass(Class<?> clazz) protected voidnotifyMissingClassInfo(Class className) protected voidserializeUnknownObject(DataOutput out, Object obj, ElsaStack objectStack) override this method to extend ElsaSerializerBase functionalityvoidsetFieldValue(ElsaSerializerPojo.FieldInfo fieldInfo, Object object, Object value) protected static booleanuseJavaSerialization(Class<?> clazz) if class uses 'Java Serialization' trick such as `Externalizable`, `writeObject`, `writeReplace`...private InputStreamwrapStream(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 Details
-
LOG
-
missingClassNotification
-
classInfoResolver
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
classInfoCache
-
sunConstructor
-
sunReflFac
-
androidConstructor
-
androidConstructorGinger
-
androidConstructorJelly
-
constructorId
-
class2constuctor
-
-
Constructor Details
-
ElsaSerializerPojo
public ElsaSerializerPojo() -
ElsaSerializerPojo
public ElsaSerializerPojo(ClassLoader classLoader, int objectStackType, Object[] singletons, Map<Class, ElsaSerializerBase.Serializer> userSer, Map<Class, Integer> userSerHeaders, Map<Integer, ElsaSerializerBase.Deserializer> userDeser, ElsaClassCallback missingClassNotification, ElsaClassInfoResolver classInfoResolver)
-
-
Method Details
-
classInfoSerialize
- Throws:
IOException
-
classInfoDeserialize
- Throws:
IOException
-
classForName
-
getClassInfo
-
notifyMissingClassInfo
-
makeClassInfo
-
makeClassInfo2
-
useJavaSerialization
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
-
makeFieldsForClass
-
isSerializable
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(Class<?> clazz) throws NotSerializableException, InvalidClassException -
getFieldValue
-
setFieldValue
-
classToId
-
serializeUnknownObject
protected void serializeUnknownObject(DataOutput out, Object obj, ElsaStack objectStack) throws IOException Description 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:
IOException- an exception from underlying stream
-
deserializeUnknownHeader
protected Object deserializeUnknownHeader(DataInput in, int head, ElsaStack objectStack) throws IOException Description 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:
IOException- an exception from underlying stream
-
wrapStream
- Throws:
IOException
-
loadClassStaticUnchecked
-
createInstanceSkippinkConstructor
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
-