Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
-
Win XP
-
Moderate
Description
ObjectStreamClass.lookup() method returns incorrect ObjectStreamClass, which could not be used for replacement in ObjectInputStream.readClassDescriptor(). The test below demonstrates the problem.
Output on RI: Passed
Output on Harmony: FAILED: expected - It's a test, but got - null
--------- Test.java -----------
import java.io.*;
public class Test implements Serializable {
public String str;
public static void main(String[] args) throws Exception {
Test t = new Test();
t.str = "It's a test";
PipedOutputStream pout = new PipedOutputStream();
PipedInputStream pin = new PipedInputStream(pout);
ObjectOutputStream out = new ObjectOutputStream(pout);
TestObjectInputStream in = new TestObjectInputStream(pin);
out.writeObject(t);
Test t1 = (Test) in.readObject();
if (!t.str.equals(t1.str))
{ System.out.println("FAILED: expected - " + t.str + ", but got - " + t1.str); }else
{ System.out.println("PASSED."); }}
static class TestObjectInputStream extends ObjectInputStream {
private static ObjectStreamClass testOsc = ObjectStreamClass.lookup(Test.class);
TestObjectInputStream(InputStream in) throws IOException
{ super(in); } protected ObjectStreamClass readClassDescriptor() throws ClassNotFoundException, IOException {
ObjectStreamClass osc = super.readClassDescriptor();
if(osc.getName().equals("Test"))
{ return testOsc; } return osc;
}
}
}
-------------------------
I've investigated the problem a bit and found that ObjectStreamClass has package-protected method getLoadFields() which is used by ObjectInputStream to get an array of ObjectStreaFields-s to be loaded from the stream in case of default de-serialization. For ObjectStreamClass created by ObjectStreamClass.lookup() method, this method returns an empty array, thus in case of default de-serialization ObjectInputStream does not try to read any field value from the stream - although there are data to be read in the stream.
I'll provide a patch soon.