Index: src/main/java/java/io/ObjectInputStream.java =================================================================== --- src/main/java/java/io/ObjectInputStream.java (revision 566528) +++ src/main/java/java/io/ObjectInputStream.java (working copy) @@ -1618,9 +1618,7 @@ Integer oldHandle = descriptorHandle; descriptorHandle = Integer.valueOf(nextHandle()); classDesc = readClassDescriptor(); - if (descriptorHandle != null) { - registerObjectRead(classDesc, descriptorHandle, false); - } + registerObjectRead(classDesc, descriptorHandle, false); descriptorHandle = oldHandle; primitiveData = emptyStream; classDesc.setClass(resolveClass(classDesc)); @@ -1700,9 +1698,7 @@ Integer oldHandle = descriptorHandle; descriptorHandle = Integer.valueOf(nextHandle()); ObjectStreamClass newClassDesc = readClassDescriptor(); - if (descriptorHandle != null) { - registerObjectRead(newClassDesc, descriptorHandle, unshared); - } + registerObjectRead(newClassDesc, descriptorHandle, unshared); descriptorHandle = oldHandle; primitiveData = emptyStream; @@ -1792,7 +1788,6 @@ descriptorHandle = (null == descriptorHandle ? Integer .valueOf(nextHandle()) : descriptorHandle); registerObjectRead(newClassDesc, descriptorHandle, false); - descriptorHandle = null; readFieldDescriptors(newClassDesc); return newClassDesc; Index: src/main/java/java/io/ObjectStreamClass.java =================================================================== --- src/main/java/java/io/ObjectStreamClass.java (revision 566528) +++ src/main/java/java/io/ObjectStreamClass.java (working copy) @@ -232,6 +232,23 @@ result.setFields(new ObjectStreamField[0]); } + // Copy all fields to loadFields - they should be read by default in + // ObjectInputStream.defaultReadObject() method + ObjectStreamField[] fields = result.getFields(); + + if (fields != null) { + ObjectStreamField[] loadFields = new ObjectStreamField[fields.length]; + + for (int i = 0; i < fields.length; ++i) { + loadFields[i] = new ObjectStreamField(fields[i].getName(), + fields[i].getType(), fields[i].isUnshared()); + + // resolve type string to init typeString field in ObjectStreamField + loadFields[i].getTypeString(); + } + result.setLoadFields(loadFields); + } + byte flags = 0; boolean externalizable = isExternalizable(cl); if (externalizable) { Index: src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java =================================================================== --- src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java (revision 566216) +++ src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java (working copy) @@ -32,12 +32,15 @@ import java.io.ObjectOutputStream; import java.io.ObjectStreamClass; import java.io.OutputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; import java.io.Serializable; import java.io.SerializablePermission; import java.io.StreamCorruptedException; import java.security.Permission; import java.util.Arrays; import java.util.Hashtable; +import java.util.HashMap; import java.util.Vector; import org.apache.harmony.testframework.serialization.SerializationTest; @@ -711,8 +714,7 @@ Object obj = ois.readObject(); ois.close(); assertEquals(cls, obj); - } - + } // Regression Test for JIRA-2340 public static class ObjectOutputStreamWithWriteDesc1 extends @@ -923,6 +925,59 @@ } } + public static class ObjectIutputStreamWithReadDesc2 extends + ObjectInputStream { + private Class returnClass; + + public ObjectIutputStreamWithReadDesc2(InputStream is, Class returnClass) + throws IOException { + super(is); + this.returnClass = returnClass; + } + + public ObjectStreamClass readClassDescriptor() throws IOException, + ClassNotFoundException { + ObjectStreamClass osc = super.readClassDescriptor(); + + if (osc.getName().equals(returnClass.getName())) { + return ObjectStreamClass.lookup(returnClass); + } + return osc; + } + } + + /* + * Testing classDescriptor replacement with the value generated by + * ObjectStreamClass.lookup() method. + * Regression test for HARMONY-4638 + */ + public void test_readClassDescriptor_1() throws IOException, ClassNotFoundException { + A a = new A(); + a.name = "It's a test"; + PipedOutputStream pout = new PipedOutputStream(); + PipedInputStream pin = new PipedInputStream(pout); + ObjectOutputStream out = new ObjectOutputStream(pout); + ObjectInputStream in = new ObjectIutputStreamWithReadDesc2(pin, A.class); + + // test single object + out.writeObject(a); + A a1 = (A) in.readObject(); + assertEquals("Single case: incorrectly read the field of A", a.name, a1.name); + + // test cyclic reference + HashMap m = new HashMap(); + a = new A(); + a.name = "It's a test 0"; + a1 = new A(); + a1.name = "It's a test 1"; + m.put("0", a); + m.put("1", a1); + out.writeObject(m); + HashMap m1 = (HashMap) in.readObject(); + assertEquals("Incorrectly read the field of A", a.name, ((A) m1.get("0")).name); + assertEquals("Incorrectly read the field of A1", a1.name, ((A) m1.get("1")).name); + } + public void test_registerValidation() throws Exception { // Regression Test for Harmony-2402 ByteArrayOutputStream baos = new ByteArrayOutputStream();