Uploaded image for project: 'Harmony'
  1. Harmony
  2. HARMONY-6439

NullPointerException thrown in certain Serialization cases

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Minor
    • Resolution: Fixed
    • 5.0M12
    • 5.0M12
    • Classlib
    • None
    • Windows

    Description

      Harmony object serialization has an initialization bug that causes NullPointerException when overriding the ObjectInputStream.readClassDescriptor and ObjectOutputStream.writeClassDescriptor methods, in order to store the ObjectStreamClass elsewhere. In Berkeley DB, overriding these methods is necessary to store the ObjectStreamClass in a separate database, to avoid repeating it redundantly in every database record. This type of overriding is supported by the Java specification, and the problem does not occur in other Java class libraries (specifically, the bug does not occur on the Sun, IBM and BEA Java platforms).

      The attached test demonstrates the problem by simply serializing and deserializing an object to/from a byte array, when readClassDescriptor and writeClassDescriptor are overridden. A NullPointerException occurs because of an uninitialized field during the call to readObject.

      C:\temp>java -classpath . ClassDescriptorOverrideBug
      java.lang.NullPointerException
      at java.io.ObjectStreamField.resolve(ObjectStreamField.java:336)
      at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1838)
      at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:799)
      at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2039)
      at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:902)
      at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2251)
      at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2208)
      at ClassDescriptorOverrideBug.doTest(ClassDescriptorOverrideBug.java:49)
      at ClassDescriptorOverrideBug.main(ClassDescriptorOverrideBug.java:29)

      Note that this problem only occurs when primitive fields are declared in the serializable class.

      A workaround for this bug is to serialize and deserialize the ObjectStreamClass before it is used. Apparently deserialization causes initialization to occur correctly.

      Attachments

        Activity

          People

            purefire Jimmy, Jing Lv
            cwl Charles Lamb
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: