Class 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 ElsaSerializerBase, it can serialize any class by analyzing its fields.

    TODO more javadoc
    See Also:
    Serialized Form
    • Field Detail

      • LOG

        private static final java.util.logging.Logger LOG
      • missingClassNotification

        protected final ElsaClassCallback missingClassNotification
      • 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()
    • 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)
      • notifyMissingClassInfo

        protected void notifyMissingClassInfo​(java.lang.Class className)
      • 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 use ObjectOutputStream to 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: ElsaSerializerBase
        Checks if given object is known to Elsa. If false is returned, Elsa will use less efficient field serializer.
        Overrides:
        isSerializable in class ElsaSerializerBase
        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.NotSerializableException
        java.io.InvalidClassException
      • 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.IOException
        Description copied from class: ElsaSerializerBase
        override this method to extend ElsaSerializerBase functionality
        Overrides:
        serializeUnknownObject in class ElsaSerializerBase
        Parameters:
        out - put binary data here
        obj - object to be serialized
        objectStack - 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.IOException
        Description copied from class: ElsaSerializerBase
        override this method to extend ElsaSerializerBase functionality
        Overrides:
        deserializeUnknownHeader in class ElsaSerializerBase
        Parameters:
        in - read binary data from here
        head - binary header read from input stream
        objectStack - 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.newInstance on Android http://stackoverflow.com/a/3448384

        If 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