This is the mail archive of the java-patches@gcc.gnu.org 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]
Other format: [Raw text]

RFC: Patch: java.io - serialization


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi list,


I have written the attached pacth to implement two functions missing 
in java.io:

ObjectInputStream.readClassDescriptor()
ObjectOutputStream.writeClassDescriptor()

Are the things I did sufficient for this ? Can somebody with more 
knowledge about serialization look into this ?


Michael
- -- 
Homepage: http://www.worldforge.org/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+xzbxWSOgCCdjSDsRAkQpAJ9sS1Df7R7NSmnAOF4YrYiwcPfzwQCfaGvt
WdLfjAecgjB59qZtKLAjHOE=
=TeAw
-----END PGP SIGNATURE-----
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.1896
diff -u -b -B -r1.1896 ChangeLog
--- ChangeLog	16 May 2003 08:09:30 -0000	1.1896
+++ ChangeLog	18 May 2003 07:23:02 -0000
@@ -1,3 +1,14 @@
+2003-05-18  Michael Koch  <konqueror@gmx.de>
+
+	* java/io/ObjectInputStream.java
+	(readClassDescriptor): New method, implementation got from readObject.
+	(readObject): Call readClassDescriptor instead of using own
+	implementation.
+	* java/io/ObjectOutputStream.java
+	(writeClassDescriptor): New method, implementation got from writeObject.
+	(writeObject): Call writeClassDescriptor instead of using own
+	implementation.
+
 2003-05-16  Michael Koch  <konqueror@gmx.de>
 
 	* java/io/natFileDescriptorPosix.cc
Index: java/io/ObjectInputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/ObjectInputStream.java,v
retrieving revision 1.17
diff -u -b -B -r1.17 ObjectInputStream.java
--- java/io/ObjectInputStream.java	24 Mar 2003 08:27:28 -0000	1.17
+++ java/io/ObjectInputStream.java	18 May 2003 07:23:02 -0000
@@ -219,44 +219,7 @@
 
 	  case TC_CLASSDESC:
 	    {
-	      dumpElement ("CLASSDESC NAME=");
-	      String name = this.realInputStream.readUTF ();
-	      dumpElement (name + "; UID=");
-	      long uid = this.realInputStream.readLong ();
-	      dumpElement (Long.toHexString(uid) + "; FLAGS=");
-	      byte flags = this.realInputStream.readByte ();
-	      dumpElement (Integer.toHexString(flags) + "; FIELD COUNT=");
-	      short field_count = this.realInputStream.readShort ();
-	      dumpElementln (Short.toString(field_count));
-	      ObjectStreamField[] fields = new ObjectStreamField[field_count];
-	      ObjectStreamClass osc = new ObjectStreamClass (name, uid,
-							     flags, fields);
-	      assignNewHandle (osc);
-	      
-	      for (int i=0; i < field_count; i++)
-		{
-		  dumpElement ("  TYPE CODE=");
-		  char type_code = (char)this.realInputStream.readByte ();
-		  dumpElement (type_code + "; FIELD NAME=");
-		  String field_name = this.realInputStream.readUTF ();
-		  dumpElementln (field_name);
-		  String class_name;
-		  
-		  if (type_code == 'L' || type_code == '[')
-		    class_name = (String)readObject ();
-		  else
-		    class_name = String.valueOf (type_code);
-		  
-		  // There're many cases you can't get java.lang.Class from
-		  // typename if your context class loader can't load it,
-		  // then use typename to construct the field
-		  fields[i] =
-		    new ObjectStreamField (field_name, class_name);
-		}
-	      
-	      boolean oldmode = setBlockDataMode (true);
-	      osc.setClass (resolveClass (osc));
-	      setBlockDataMode (oldmode);
+	      ObjectStreamClass osc = readClassDescriptor ();
 	      
 	      if (!is_consumed)
 		{
@@ -449,6 +412,51 @@
       }
     
     return ret_val;
+  }
+
+  protected ObjectStreamClass readClassDescriptor ()
+    throws ClassNotFoundException, IOException
+  {
+    dumpElement ("CLASSDESC NAME=");
+    String name = this.realInputStream.readUTF ();
+    dumpElement (name + "; UID=");
+    long uid = this.realInputStream.readLong ();
+    dumpElement (Long.toHexString(uid) + "; FLAGS=");
+    byte flags = this.realInputStream.readByte ();
+    dumpElement (Integer.toHexString(flags) + "; FIELD COUNT=");
+    short field_count = this.realInputStream.readShort ();
+    dumpElementln (Short.toString(field_count));
+    ObjectStreamField[] fields = new ObjectStreamField[field_count];
+    ObjectStreamClass osc = new ObjectStreamClass (name, uid,
+                                                   flags, fields);
+    assignNewHandle (osc);
+	      
+    for (int i=0; i < field_count; i++)
+      {
+	dumpElement ("  TYPE CODE=");
+	char type_code = (char)this.realInputStream.readByte ();
+	dumpElement (type_code + "; FIELD NAME=");
+	String field_name = this.realInputStream.readUTF ();
+	dumpElementln (field_name);
+	String class_name;
+		  
+	if (type_code == 'L' || type_code == '[')
+	  class_name = (String)readObject ();
+	else
+	  class_name = String.valueOf (type_code);
+		  
+	// There're many cases you can't get java.lang.Class from
+	// typename if your context class loader can't load it,
+	// then use typename to construct the field
+	fields[i] =
+	  new ObjectStreamField (field_name, class_name);
+      }
+	      
+    boolean oldmode = setBlockDataMode (true);
+    osc.setClass (resolveClass (osc));
+    setBlockDataMode (oldmode);
+	      
+    return osc;
   }
 
   /**
Index: java/io/ObjectOutputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/ObjectOutputStream.java,v
retrieving revision 1.15
diff -u -b -B -r1.15 ObjectOutputStream.java
--- java/io/ObjectOutputStream.java	28 Mar 2003 09:49:44 -0000	1.15
+++ java/io/ObjectOutputStream.java	18 May 2003 07:23:07 -0000
@@ -224,46 +224,7 @@
 	      }
 
 	    if (obj instanceof ObjectStreamClass)
-	      {
-		ObjectStreamClass osc = (ObjectStreamClass)obj;
-		realOutput.writeByte (TC_CLASSDESC);
-		realOutput.writeUTF (osc.getName ());
-		realOutput.writeLong (osc.getSerialVersionUID ());
-		assignNewHandle (obj);
-
-		int flags = osc.getFlags ();
-
-		if (protocolVersion == PROTOCOL_VERSION_2
-		    && osc.isExternalizable ())
-		  flags |= SC_BLOCK_DATA;
-
-		realOutput.writeByte (flags);
-
-		ObjectStreamField[] fields = osc.fields;
-		realOutput.writeShort (fields.length);
-
-		ObjectStreamField field;
-		for (int i=0; i < fields.length; i++)
-		  {
-		    field = fields[i];
-		    realOutput.writeByte (field.getTypeCode ());
-		    realOutput.writeUTF (field.getName ());
-
-		    if (! field.isPrimitive ())
-		      writeObject (field.getTypeString ());
-		  }
-
-		boolean oldmode = setBlockDataMode (true);
-		annotateClass (osc.forClass ());
-		setBlockDataMode (oldmode);
-		realOutput.writeByte (TC_ENDBLOCKDATA);
-
-		if (osc.isSerializable ())
-		  writeObject (osc.getSuper ());
-		else
-		  writeObject (null);
-		break;
-	      }
+	      writeClassDescriptor ((ObjectStreamClass) obj);
 
 	    if ((replacementEnabled || obj instanceof Serializable)
 		&& ! replaceDone)
@@ -406,6 +367,46 @@
       }
   }
 
+  protected void writeClassDescriptor (ObjectStreamClass osc) throws IOException
+  {
+    realOutput.writeByte (TC_CLASSDESC);
+    realOutput.writeUTF (osc.getName ());
+    realOutput.writeLong (osc.getSerialVersionUID ());
+    assignNewHandle (osc);
+
+    int flags = osc.getFlags ();
+
+    if (protocolVersion == PROTOCOL_VERSION_2
+	&& osc.isExternalizable ())
+      flags |= SC_BLOCK_DATA;
+
+    realOutput.writeByte (flags);
+
+    ObjectStreamField[] fields = osc.fields;
+    realOutput.writeShort (fields.length);
+
+    ObjectStreamField field;
+    for (int i=0; i < fields.length; i++)
+      {
+	field = fields[i];
+	realOutput.writeByte (field.getTypeCode ());
+	realOutput.writeUTF (field.getName ());
+
+	if (! field.isPrimitive ())
+	  writeObject (field.getTypeString ());
+      }
+
+    boolean oldmode = setBlockDataMode (true);
+    annotateClass (osc.forClass ());
+    setBlockDataMode (oldmode);
+    realOutput.writeByte (TC_ENDBLOCKDATA);
+
+    if (osc.isSerializable ())
+      writeObject (osc.getSuper ());
+    else
+      writeObject (null);
+  }
+  
   /**
      Writes the current objects non-transient, non-static fields from
      the current class to the underlying output stream.

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