You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by li...@apache.org on 2007/03/01 09:49:03 UTC

svn commit: r513229 - in /harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/io/ObjectStreamClass.java main/java/java/io/ObjectStreamField.java test/java/tests/api/java/io/ObjectStreamFieldTest.java

Author: liangyx
Date: Thu Mar  1 00:49:02 2007
New Revision: 513229

URL: http://svn.apache.org/viewvc?view=rev&rev=513229
Log:
ObjectInputStream.readFields loses the unshared attribute when deserializing fields

Modified:
    harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java
    harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamField.java
    harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectStreamFieldTest.java

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java?view=diff&rev=513229&r1=513228&r2=513229
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java Thu Mar  1 00:49:02 2007
@@ -314,7 +314,7 @@
         }
         fields = _fields;
     }
-
+    
     /**
      * Compute and return the Serial Version UID of the class <code>cl</code>.
      * The value is computed based on the class name, superclass chain, field
@@ -654,7 +654,33 @@
      *         represents
      */
     public ObjectStreamField[] getFields() {
+        copyFieldAttributes();
         return loadFields == null ? fields().clone() : loadFields.clone();
+    }
+
+    /**
+     * If a Class uses "serialPersistentFields" to define the serialized fields, 
+     * this.loadFields cannot get the "unshared" information when deserializing
+     * fields using current implementation of ObjectInputStream. This method 
+     * provides a way to copy the "unshared" attribute from this.fields.
+     *
+     */
+    private void copyFieldAttributes() {
+        if ((loadFields == null) || fields == null) {
+            return;
+        }
+        
+        for (int i = 0; i < loadFields.length; i++) {
+            ObjectStreamField loadField = loadFields[i];
+            String name = loadField.getName();
+            for (int j = 0; j < fields.length; j++) {
+                ObjectStreamField field = fields[j];
+                if (name.equals(field.getName())) {
+                    loadField.setUnshared(field.isUnshared());
+                    break;
+                }
+            }
+        }
     }
 
     /**

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamField.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamField.java?view=diff&rev=513229&r1=513228&r2=513229
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamField.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamField.java Thu Mar  1 00:49:02 2007
@@ -342,4 +342,8 @@
     public boolean isUnshared() {
         return unshared;
     }
+    
+    void setUnshared(boolean unshared) {
+        this.unshared = unshared;
+    }
 }

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectStreamFieldTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectStreamFieldTest.java?view=diff&rev=513229&r1=513228&r2=513229
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectStreamFieldTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectStreamFieldTest.java Thu Mar  1 00:49:02 2007
@@ -19,6 +19,8 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.NotActiveException;
@@ -187,7 +189,30 @@
         assertEquals(Object.class, field.getType());
     }
     
-
+    public void test_isUnshared() throws Exception {
+        SerializableObject2 obj = new SerializableObject2();
+        
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(obj);
+        oos.close();
+        baos.close();
+        byte[] bytes = baos.toByteArray();
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        ObjectInputStream ois = new ObjectInputStream(bais);
+        SerializableObject2 newObj = (SerializableObject2) ois.readObject();
+        
+        ObjectInputStream.GetField getField = newObj.getGetField();
+        ObjectStreamClass objectStreamClass = getField.getObjectStreamClass();
+        
+        assertTrue(objectStreamClass.getField("i").isUnshared());
+        assertFalse(objectStreamClass.getField("d").isUnshared());
+        assertTrue(objectStreamClass.getField("s").isUnshared());
+        
+        assertEquals(1000, getField.get("i", null));
+        assertEquals(SerializableObject2.today, getField.get("d", null));
+        assertEquals("Richard", getField.get("s", null));
+    }
 
 	/**
 	 * Sets up the fixture, for example, open a network connection. This method
@@ -268,5 +293,37 @@
 
     public ObjectStreamClass getObjectStreamClass() {
         return temp;
+    }
+}
+
+class SerializableObject2 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    
+    private static final ObjectStreamField[] serialPersistentFields = {
+        new ObjectStreamField("i", Integer.class, true),
+        new ObjectStreamField("d", Date.class, false),
+        new ObjectStreamField("s", String.class, true),
+    };
+    
+    private ObjectInputStream.GetField getField;
+    
+    public static Date today = new Date(1172632429156l);
+    
+    public ObjectInputStream.GetField getGetField() {
+        return getField;
+    }
+    
+    private void writeObject(ObjectOutputStream o) throws IOException {
+        ObjectOutputStream.PutField putField = o.putFields();
+        putField.put("i", new Integer(1000));
+        putField.put("d", today);
+        putField.put("s", "Richard");
+        o.writeFields();
+    }
+
+    private void readObject(ObjectInputStream in) throws NotActiveException,
+            IOException, ClassNotFoundException {
+        getField = in.readFields();
     }
 }