Hi,

I fixed serialization/deseriazation of Proxy instances. Together with my
previous patch (javax.naming.CompoundName serialization) this allows a
JNDI lookup against JBoss to work now. I don't know anything about JNDI,
RMI or JBoss, so I don't know whether you can do anything useful now,
but it's a first step.

Regards,
Jeroen

2005-09-08  Jeroen Frijters  <[EMAIL PROTECTED]>

        * java/io/ObjectInputStream.java
        (readObject): Removed println and fixed Proxy class descriptor
        deserialization.
        (resolveProxyClass): Use Class.forName() instead of calling
        ClassLoader.loadClass() directly.
        * java/io/ObjectOutputStream.java
        (writeClassDescriptor): Added support for serializing Proxy
        class descriptor.
Index: java/io/ObjectInputStream.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/ObjectInputStream.java,v
retrieving revision 1.62
diff -u -r1.62 ObjectInputStream.java
--- java/io/ObjectInputStream.java      13 Aug 2005 18:02:38 -0000      1.62
+++ java/io/ObjectInputStream.java      8 Sep 2005 08:16:49 -0000
@@ -199,7 +199,6 @@
              for (int i = 0; i < n_intf; i++)
                {
                  intfs[i] = this.realInputStream.readUTF();
-                 System.out.println(intfs[i]);
                }
              
              boolean oldmode = setBlockDataMode(true);
@@ -219,6 +218,10 @@
                is_consumed = false;
              ObjectStreamClass superosc = (ObjectStreamClass)readObject();
              osc.setSuperclass(superosc);
+              osc.firstNonSerializableParentConstructor =
+                superosc.firstNonSerializableParentConstructor;
+              osc.fieldMapping = new ObjectStreamField[0];
+              osc.realClassIsSerializable = true;
              ret_val = osc;
              break;
            }
@@ -874,7 +877,7 @@
       }
     else
       for (int i = 0; i < intfs.length; i++)
-       clss[i] = cl.loadClass(intfs[i]);
+       clss[i] = Class.forName(intfs[i], false, cl);
     try 
       {
        return Proxy.getProxyClass(cl, clss);
Index: java/io/ObjectOutputStream.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/ObjectOutputStream.java,v
retrieving revision 1.57
diff -u -r1.57 ObjectOutputStream.java
--- java/io/ObjectOutputStream.java     10 Jul 2005 18:29:07 -0000      1.57
+++ java/io/ObjectOutputStream.java     8 Sep 2005 08:16:53 -0000
@@ -412,37 +412,53 @@
 
   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++)
+    if (osc.isProxyClass)
       {
-       field = fields[i];
-       realOutput.writeByte(field.getTypeCode ());
-       realOutput.writeUTF(field.getName ());
-
-       if (! field.isPrimitive())
-         writeObject(field.getTypeString());
+        realOutput.writeByte(TC_PROXYCLASSDESC);
+       Class[] intfs = osc.forClass().getInterfaces();
+       realOutput.writeInt(intfs.length);
+       for (int i = 0; i < intfs.length; i++)
+         realOutput.writeUTF(intfs[i].getName());
+
+        boolean oldmode = setBlockDataMode(true);
+        annotateProxyClass(osc.forClass());
+        setBlockDataMode(oldmode);
+        realOutput.writeByte(TC_ENDBLOCKDATA);
+      }
+    else
+      {
+        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);
       }
-
-    boolean oldmode = setBlockDataMode(true);
-    annotateClass(osc.forClass());
-    setBlockDataMode(oldmode);
-    realOutput.writeByte(TC_ENDBLOCKDATA);
 
     if (osc.isSerializable() || osc.isExternalizable())
       writeObject(osc.getSuper());
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to