This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
RFC: Patch: java.io - serialization
- From: Michael Koch <konqueror at gmx dot de>
- To: java-patches at gcc dot gnu dot org
- Date: Sun, 18 May 2003 09:32:01 +0200
- Subject: 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.