This is the mail archive of the java-patches@sources.redhat.com mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch: More Serialization fixes


Folks,
Here are some serialization patches I'm checking in.  They affect the code
merged from Classpath; I'll also be checking the patches there too (I
standardly do this in order to keep them in sync).

These fixes allow the Mauve java/io/ObjectInputOutput tests to serialize
properly (except for some serialVersionUID mismatches that are being
worked out on the compiler side).  As the Mauve tests mostly cover the 
general cases of Object serialization, this means that serialization
should be working pretty well at this point.

Note that for the ObjectInputOutput tests there are data files in the
repository that were created based on JDK 1.2 serialization output; output
for other versions of the JDK can be created locally by running the
'write-ref-data.sh' script which is also part of the repository in that
directory.  The script works off the installed version of Java but you can
tweak it to run whatever version you have available and desire.

Since libgcj is not quite JDK 1.2 compliant, the JDK 1.2 serialized data
causes errors to be reported with the Mauve test for Test$Extern and
Test$HairyGraph.  Using data files for these tests created with the JDK
1.1 per the shell script mentioned above allows those tests to pass with
zero failures (except for (hopefully) temporary discrepancies regarding
serialVersionUID's as mentioned above).  As libgcj becomes more JDK 1.2
compliant, this issue will go away.

Enjoy!
--warrenl



2000-08-03  Warren Levy  <warrenl@cygnus.com>

	* java/io/ObjectInputStream.java (readFields): Turn off
	readDataFromBlock while reading via GetField.
	(GetField$1.get(String, Object)): Pass Class of default value to
	getField.
	(getField): Allow for null default values.

	* java/io/ObjectOutputStream.java: Fixed typo in comment.
	(PutField$1.put): Fixed calls of checkType in most of the put
	methods to pass the correct parameter.
	(PutField$1.put(String, Object)): Allow for null value arg.
	(PutField$1.write): Turn off writeDataAsBlocks while writing via
	PutField.

	* java/io/ObjectStreamClass.java (serialPersistentFields): Fixed
	typo in spec'ed field name.
	(getSerialPersistentFields): Changed spelling of method to match
	the correct spelling of the spec'ed field name.


Index: java/io/ObjectInputStream.java
===================================================================
RCS file: /cvs/java/libgcj/libjava/java/io/ObjectInputStream.java,v
retrieving revision 1.1
diff -u -p -r1.1 ObjectInputStream.java
--- ObjectInputStream.java	2000/05/19 17:55:31	1.1
+++ ObjectInputStream.java	2000/08/04 00:07:58
@@ -700,9 +700,15 @@ public class ObjectInputStream extends I
     final ObjectStreamClass clazz = this.currentObjectStreamClass;
     final byte[] prim_field_data = new byte[clazz.primFieldSize];
     final Object[] objs = new Object[clazz.objectFieldCount];
+
+    // Apparently Block data is not used with GetField as per
+    // empirical evidence against JDK 1.2.  Also see Mauve test
+    // java.io.ObjectInputOutput.Test.GetPutField.
+    setBlockDataMode (false);
     readFully (prim_field_data);
     for (int i = 0; i < objs.length; ++ i)
       objs[i] = readObject ();
+    setBlockDataMode (true);
 
     return new GetField ()
     {
@@ -843,7 +849,8 @@ public class ObjectInputStream extends I
       public Object get (String name, Object defvalue)
 	throws IOException, IllegalArgumentException
       {
-	ObjectStreamField field = getField (name, null);
+	ObjectStreamField field =
+	  getField (name, defvalue == null ? null : defvalue.getClass ());
 
 	if (field == null)
 	  return defvalue;
@@ -862,7 +869,7 @@ public class ObjectInputStream extends I
 	Class field_type = field.getType ();
 
 	if (type == field_type ||
-	    (type != null && field_type.isPrimitive ()))
+	    (type == null && ! field_type.isPrimitive ()))
 	  return field;
 
 	throw new IllegalArgumentException ("Field requested is of type "
Index: java/io/ObjectOutputStream.java
===================================================================
RCS file: /cvs/java/libgcj/libjava/java/io/ObjectOutputStream.java,v
retrieving revision 1.4
diff -u -p -r1.4 ObjectOutputStream.java
--- ObjectOutputStream.java	2000/07/28 23:48:19	1.4
+++ ObjectOutputStream.java	2000/08/04 00:07:58
@@ -138,7 +138,7 @@ public class ObjectOutputStream extends 
      output stream by writing out information about its class, then
      writing out each of the objects non-transient, non-static
      fields.  If any of these fields are other objects,
-     the are written out in the same manner.
+     they are written out in the same manner.
 
      This method can be overriden by a class by implementing
      <code>private void writeObject (ObjectOutputStream)</code>.
@@ -846,7 +846,7 @@ public class ObjectOutputStream extends 
 	  {
 	    ObjectStreamField field
 	      = currentObjectStreamClass.getField (name);
-	    checkType (field, 'B');
+	    checkType (field, 'C');
 	    int off = field.getOffset ();
 	    prim_field_data[off++] = (byte)(value >>> 8);
 	    prim_field_data[off] = (byte)value;
@@ -857,7 +857,7 @@ public class ObjectOutputStream extends 
 	  {
 	    ObjectStreamField field
 	      = currentObjectStreamClass.getField (name);
-	    checkType (field, 'B');
+	    checkType (field, 'D');
 	    int off = field.getOffset ();
 	    long l_value = Double.doubleToLongBits (value);
 	    prim_field_data[off++] = (byte)(l_value >>> 52);
@@ -875,7 +875,7 @@ public class ObjectOutputStream extends 
 	  {
 	    ObjectStreamField field
 	      = currentObjectStreamClass.getField (name);
-	    checkType (field, 'B');
+	    checkType (field, 'F');
 	    int off = field.getOffset ();
 	    int i_value = Float.floatToIntBits (value);
 	    prim_field_data[off++] = (byte)(i_value >>> 24);
@@ -889,7 +889,7 @@ public class ObjectOutputStream extends 
 	  {
 	    ObjectStreamField field
 	      = currentObjectStreamClass.getField (name);
-	    checkType (field, 'B');
+	    checkType (field, 'I');
 	    int off = field.getOffset ();
 	    prim_field_data[off++] = (byte)(value >>> 24);
 	    prim_field_data[off++] = (byte)(value >>> 16);
@@ -902,7 +902,7 @@ public class ObjectOutputStream extends 
 	  {
 	    ObjectStreamField field
 	      = currentObjectStreamClass.getField (name);
-	    checkType (field, 'B');
+	    checkType (field, 'J');
 	    int off = field.getOffset ();
 	    prim_field_data[off++] = (byte)(value >>> 52);
 	    prim_field_data[off++] = (byte)(value >>> 48);
@@ -919,7 +919,7 @@ public class ObjectOutputStream extends 
 	  {
 	    ObjectStreamField field
 	      = currentObjectStreamClass.getField (name);
-	    checkType (field, 'B');
+	    checkType (field, 'S');
 	    int off = field.getOffset ();
 	    prim_field_data[off++] = (byte)(value >>> 8);
 	    prim_field_data[off] = (byte)value;
@@ -930,16 +930,22 @@ public class ObjectOutputStream extends 
 	  {
 	    ObjectStreamField field
 	      = currentObjectStreamClass.getField (name);
-	    if (! field.getType ().isAssignableFrom (value.getClass ()))
+	    if (value != null &&
+	    	! field.getType ().isAssignableFrom (value.getClass ()))
 	      throw new IllegalArgumentException ();
 	    objs[field.getOffset ()] = value;
 	  }
 
 	public void write (ObjectOutput out) throws IOException
 	  {
+	    // Apparently Block data is not used with PutField as per
+	    // empirical evidence against JDK 1.2.  Also see Mauve test
+	    // java.io.ObjectInputOutput.Test.GetPutField.
+	    setBlockDataMode (false);
 	    out.write (prim_field_data);
 	    for (int i = 0; i < objs.length; ++ i)
 	      out.writeObject (objs[i]);
+	    setBlockDataMode (true);
 	  }
 
 	private void checkType (ObjectStreamField field, char type)
Index: java/io/ObjectStreamClass.java
===================================================================
RCS file: /cvs/java/libgcj/libjava/java/io/ObjectStreamClass.java,v
retrieving revision 1.3
diff -u -p -r1.3 ObjectStreamClass.java
--- ObjectStreamClass.java	2000/07/27 23:57:06	1.3
+++ ObjectStreamClass.java	2000/08/04 00:07:59
@@ -350,15 +350,15 @@ public class ObjectStreamClass implement
 
     try
     {
-      Field serialPersistantFields
-	= cl.getDeclaredField ("serialPersistantFields");
-      int modifiers = serialPersistantFields.getModifiers ();
+      Field serialPersistentFields
+	= cl.getDeclaredField ("serialPersistentFields");
+      int modifiers = serialPersistentFields.getModifiers ();
 
       if (Modifier.isStatic (modifiers)
 	  && Modifier.isFinal (modifiers)
 	  && Modifier.isPrivate (modifiers))
       {
-	fields = getSerialPersistantFields (cl);
+	fields = getSerialPersistentFields (cl);
 	Arrays.sort (fields);
 	calculateOffsets ();
 	return;
@@ -569,15 +569,15 @@ public class ObjectStreamClass implement
   }
 
   // Returns the value of CLAZZ's private static final field named
-  // `serialPersistantFields'.
-  private ObjectStreamField[] getSerialPersistantFields (Class clazz)
+  // `serialPersistentFields'.
+  private ObjectStreamField[] getSerialPersistentFields (Class clazz)
   {
     ObjectStreamField[] o = null;
     try
       {
 	// Use getDeclaredField rather than getField for the same reason
 	// as above in getDefinedSUID.
-	Field f = clazz.getDeclaredField ("getSerialPersistantFields");
+	Field f = clazz.getDeclaredField ("getSerialPersistentFields");
 	o = (ObjectStreamField[])f.get (null);
       }
     catch (java.lang.NoSuchFieldException e)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]