harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Charles Lamb <charles.l...@gmail.com>
Subject Harmony-6439: Bug in Serialization found while running Berkeley DB Java Edition on Android
Date Fri, 05 Feb 2010 13:49:53 GMT
Hello,

I have submitted Jira HARMONY-6439 for this issue.  Credit to my
colleagues Mark Hayes and Haomian Wang for narrowing this down.

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 Java Edition, 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.



Mime
View raw message