[kaffe] CVS kaffe (guilhem): Fixes for serialization regression.

Kaffe CVS cvs-commits at kaffe.org
Sat Dec 10 11:45:22 PST 2005


PatchSet 6993 
Date: 2005/12/10 19:38:16
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Fixes for serialization regression.

        * test/regression/TestSerialFields.java,
        test/regression/TestSerialPersistent.java,
        test/regression/TestSerialVersions.java: Fixed class ordering
        problem. Changed output accordingly. We expect an
        InvalidClassException in Duplicates & Overlap now.

        * libraries/javalib/external/classpath/java/io/ObjectOutputStream.java,
        libraries/javalib/external/classpath/java/io/ObjectStreamClass.java:
        Temporary patch before synchronizing with classpath.

Members: 
	ChangeLog:1.4514->1.4515 
	libraries/javalib/external/classpath/java/io/ObjectOutputStream.java:1.2->1.3 
	libraries/javalib/external/classpath/java/io/ObjectStreamClass.java:1.1->1.2 
	test/regression/TestSerialFields.java:INITIAL->1.3 
	test/regression/TestSerialPersistent.java:INITIAL->1.3 
	test/regression/TestSerialVersions.java:INITIAL->1.3 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4514 kaffe/ChangeLog:1.4515
--- kaffe/ChangeLog:1.4514	Sat Dec 10 01:39:14 2005
+++ kaffe/ChangeLog	Sat Dec 10 19:38:16 2005
@@ -1,3 +1,15 @@
+2005-12-10  Guilhem Lavaux  <guilhem at kaffe.org>
+
+	* test/regression/TestSerialFields.java,
+	test/regression/TestSerialPersistent.java,
+	test/regression/TestSerialVersions.java: Fixed class ordering
+	problem. Changed output accordingly. We expect an
+	InvalidClassException in Duplicates & Overlap now.
+
+	* libraries/javalib/external/classpath/java/io/ObjectOutputStream.java,
+	libraries/javalib/external/classpath/java/io/ObjectStreamClass.java:
+	Temporary patch before synchronizing with classpath.
+
 2005-12-10  Ito Kazumitsu  <kaz at maczuka.gcd.org>
 
 	* FAQ/FAQ.classlibrary-compile: Updated the description of ecj.
Index: kaffe/libraries/javalib/external/classpath/java/io/ObjectOutputStream.java
diff -u kaffe/libraries/javalib/external/classpath/java/io/ObjectOutputStream.java:1.2 kaffe/libraries/javalib/external/classpath/java/io/ObjectOutputStream.java:1.3
--- kaffe/libraries/javalib/external/classpath/java/io/ObjectOutputStream.java:1.2	Sat Nov 26 20:30:03 2005
+++ kaffe/libraries/javalib/external/classpath/java/io/ObjectOutputStream.java	Sat Dec 10 19:38:19 2005
@@ -442,6 +442,10 @@
         realOutput.writeByte(flags);
 
         ObjectStreamField[] fields = osc.fields;
+
+	if (fields == ObjectStreamClass.INVALID_FIELDS)
+	    throw new InvalidClassException("serialPersistentFields in class " + osc.getName() + " is invalid");
+
         realOutput.writeShort(fields.length);
 
         ObjectStreamField field;
Index: kaffe/libraries/javalib/external/classpath/java/io/ObjectStreamClass.java
diff -u kaffe/libraries/javalib/external/classpath/java/io/ObjectStreamClass.java:1.1 kaffe/libraries/javalib/external/classpath/java/io/ObjectStreamClass.java:1.2
--- kaffe/libraries/javalib/external/classpath/java/io/ObjectStreamClass.java:1.1	Wed Oct 19 20:37:05 2005
+++ kaffe/libraries/javalib/external/classpath/java/io/ObjectStreamClass.java	Sat Dec 10 19:38:19 2005
@@ -63,6 +63,8 @@
 
 public class ObjectStreamClass implements Serializable
 {
+    static final ObjectStreamField[] INVALID_FIELDS = new ObjectStreamField[0];
+
   /**
    * Returns the <code>ObjectStreamClass</code> for <code>cl</code>.
    * If <code>cl</code> is null, or is not <code>Serializable</code>,
@@ -608,6 +610,28 @@
 	    fields = getSerialPersistentFields(cl);
 	    if (fields != null)
 	      {
+		ObjectStreamField[] fieldsName = new ObjectStreamField[fields.length];
+		System.arraycopy(fields, 0, fieldsName, 0, fields.length);
+
+		Arrays.sort (fieldsName, new Comparator() {
+			public int compare(Object o1, Object o2)
+			{
+			  ObjectStreamField f1 = (ObjectStreamField)o1;
+			  ObjectStreamField f2 = (ObjectStreamField)o2;
+			    
+			  return f1.getName().compareTo(f2.getName());
+			}
+		    });
+		
+		for (int i=1; i < fields.length; i++)
+		  {
+		    if (fieldsName[i-1].getName().equals(fieldsName[i].getName()))
+			{
+			    fields = INVALID_FIELDS;
+			    return;
+			}
+		  }
+
 		Arrays.sort (fields);
 		// Retrieve field reference.
 		for (int i=0; i < fields.length; i++)
===================================================================
Checking out kaffe/test/regression/TestSerialFields.java
RCS:  /home/cvs/kaffe/kaffe/test/regression/TestSerialFields.java,v
VERS: 1.3
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/test/regression/TestSerialFields.java	Sat Dec 10 19:45:21 2005
@@ -0,0 +1,735 @@
+/*
+ * Tests of ObjectInputStream.GetField and ObjectOutputStream.PutField.
+ * Doesn't test too aggressively (for example, none of the tests make
+ * sure what they say gets written out, actually gets written out.)
+ * See SerializationCompatibility for more aggressive testing.
+ *
+ * Copyright (c) 2002 Pat Tullmann
+ * All Rights Reserved.
+ *
+ * This file is released into the public domain.
+ *
+ * @author Pat Tullmann <pat_kaffe at tullmann.org>
+ */
+import java.io.*;
+import java.util.*;
+
+public class TestSerialFields
+{
+	// Set to true to get stack traces and byte-dumps:
+	private static final boolean DEBUG = false;
+
+	public static final long constantUID = 0x42L;
+
+	private static final String[] allFieldNames = 
+	{
+		"x", "y",
+		"xd", "yd",
+		"xodd", "yodd",
+	};
+	
+	private static void checkGetBool(ObjectInputStream.GetField inputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			boolean val = inputFields.get(fname, false);
+			System.out.print(" bool=" +val);
+		}
+		catch (IllegalArgumentException iae)
+		{
+			// ignore
+			if (DEBUG) System.out.print(" /*not boolean*/");
+		}
+	}
+
+	private static void checkGetObject(ObjectInputStream.GetField inputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			Object val = inputFields.get(fname, null);
+			System.out.print(" Object=" +val);
+		}
+		catch (IllegalArgumentException iae)
+		{
+			// ignore
+			if (DEBUG) System.out.print(" /*not Object*/");
+		}
+	}
+
+	private static void checkGetInt(ObjectInputStream.GetField inputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			int val = inputFields.get(fname, 0);
+			System.out.print(" int=" +val);
+		}
+		catch (IllegalArgumentException iae)
+		{
+			// ignore
+			if (DEBUG) System.out.print(" /*not int*/");
+		}
+	}
+
+	private static void checkGetDouble(ObjectInputStream.GetField inputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			double val = inputFields.get(fname, 0.0);
+			System.out.print(" double=" +val+ " ");
+		}
+		catch (IllegalArgumentException iae)
+		{
+			// ignore
+			if (DEBUG) System.out.print(" /*not double*/");
+		}
+	}
+
+	private static boolean checkGetDefaulted(ObjectInputStream.GetField inputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			boolean defaulted = inputFields.defaulted(fname);
+			System.out.print("    " +fname+ ":");
+			if (defaulted)
+				System.out.print(" (defaulted)");
+			return true;
+		}
+		catch (IllegalArgumentException iae)
+		{
+			return false;
+		}
+	}
+
+	private static void checkGetFields(ObjectInputStream.GetField inputFields)
+		throws IOException
+	{
+		for (int i = 0; i < allFieldNames.length; i++)
+		{
+			String fname = allFieldNames[i];
+			if (!checkGetDefaulted(inputFields, fname))
+				continue;
+			checkGetBool(inputFields, fname);
+			checkGetObject(inputFields, fname);
+			checkGetInt(inputFields, fname);
+			checkGetDouble(inputFields, fname);
+			System.out.println();
+		}
+	}
+	
+	private static String checkPutBool(ObjectOutputStream.PutField outputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			outputFields.put(fname, true);
+			return "bool=true ";
+		}
+		catch (IllegalArgumentException iae)
+		{
+			if (DEBUG) return "/*not boolean*/ ";
+			return "";
+		}
+	}
+
+	private static String checkPutString(ObjectOutputStream.PutField outputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			outputFields.put(fname, new String("putfield test string"));
+			return "string='putfield test string' ";
+		}
+		catch (IllegalArgumentException iae)
+		{
+			if (DEBUG) return "/*not Object*/ ";
+			return "";
+		}
+	}
+
+	private static String checkPutInt(ObjectOutputStream.PutField outputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			outputFields.put(fname, 42);
+			return "int=42 ";
+		}
+		catch (IllegalArgumentException iae)
+		{
+			if (DEBUG) return "/*not int*/ ";
+			return "";
+		}
+	}
+
+	private static String checkPutDouble(ObjectOutputStream.PutField outputFields, String fname)
+		throws IOException
+	{
+		try
+		{
+			outputFields.put(fname, 6.9);
+			return "double=6.9 ";
+		}
+		catch (IllegalArgumentException iae)
+		{
+			if (DEBUG) return "/*not double*/ ";
+			return "";
+		}
+	}
+
+	private static void checkPutFields(ObjectOutputStream.PutField outputFields)
+		throws IOException
+	{
+		for (int i = 0; i < allFieldNames.length; i++)
+		{
+			String fname = allFieldNames[i];
+			String msg = "";
+			msg += checkPutBool(outputFields, fname);
+			msg += checkPutString(outputFields, fname);
+			msg += checkPutInt(outputFields, fname);
+			msg += checkPutDouble(outputFields, fname);
+
+			if (!msg.equals(""))
+			{
+				System.out.print("    put " +fname+ ": ");
+				System.out.print(msg);
+				System.out.println();
+			}
+		}
+	}
+
+
+	private static class Test0001 // "original" (pristine) version
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private int x = 0x042;
+		private int y = 0x069;
+
+		// Garbage fields that won't be read by anyone
+		private int[] iarray = new int[] { 1, 2, 3};
+		private Integer X = new Integer(44);
+		private long foo = 11;
+		private double xf = 32.45;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + " x=" +x+ "; y=" +y+ "; foo=" +foo);
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkPutFields(stream.putFields());
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkGetFields(stream.readFields());
+		}
+
+	}
+	
+	private static class Test0002 // contains doubles
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private double xd = 0;
+		private double yd = 0;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + " instance");
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkPutFields(stream.putFields());
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkGetFields(stream.readFields());
+		}
+	}
+	
+	private static class Test0005 // missing x,y fields
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + " instance");
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkPutFields(stream.putFields());
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkGetFields(stream.readFields());
+		}
+	}
+	
+
+	private static class Test0008 // Compatible via serialPersistentFields...
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			new ObjectStreamField("x", int.class),
+			new ObjectStreamField("y", int.class)
+		};
+
+		public String toString()
+		{
+			return (this.getClass().getName() + " instance");
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkPutFields(stream.putFields());
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkGetFields(stream.readFields());
+		}
+	}
+	
+
+	private static class Test0010 // Compatible, but different (and invalid) serialPersistentFields...
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			new ObjectStreamField("xodd", String.class),
+			new ObjectStreamField("yodd", String.class)
+		};
+		private int x;
+		private int y;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + " instance");
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkPutFields(stream.putFields());
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			TestSerialFields.checkGetFields(stream.readFields());
+		}
+	}
+	
+
+	private static class Test0011 // Compatible, broken writeObject
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private int x;
+		private int y;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + " instance");
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			//Object ignored = stream.putFields();
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			stream.readFields();
+		}
+	}
+
+	private static class Test0012 // check defaultReadObject
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private int x = 11;
+		private int y = 12;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + ": " +x+ "," +y);
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			Object x = stream.putFields();
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			stream.defaultReadObject();
+		}
+	}
+
+	private static class Test0014 // bogus reads/puts
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private int x = 11;
+		private int y = 12;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + ": " +x+ "," +y);
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			ObjectOutputStream.PutField pf = stream.putFields();
+			pf.put("totallyBogus", true);
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			ObjectInputStream.GetField gf = stream.readFields();
+			gf.get("totallyBogus", true);
+		}
+	}
+
+	private static class Test0015 // impossible field names
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private int x = 11;
+		private int y = 12;
+
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			new ObjectStreamField("x", int.class),
+			new ObjectStreamField("No $!#%ing way!", String.class),
+			new ObjectStreamField("y", int.class),
+		};
+
+		public String toString()
+		{
+			return (this.getClass().getName() + ": " +x+ "," +y);
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			ObjectOutputStream.PutField pf = stream.putFields();
+			pf.put("No $!#%ing way!", "way");
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			ObjectInputStream.GetField gf = stream.readFields();
+			gf.get("No $!#%ing way!", "way");
+		}
+	}
+
+	// XXX JDK1.4 and Kaffe differ on this one (JDK blows up with multiple 
+	// readFields()) both Kaffe and JDK1.4 are fine with multiple putFields.
+	private static class Test0016 // multiple gets/sets
+	implements Serializable
+	{
+		private static final long serialVersionUID = constantUID;
+		private int x = 11;
+		private int y = 12;
+
+		public String toString()
+		{
+			return (this.getClass().getName() + ": " +x+ "," +y);
+		}
+
+		private void writeObject(ObjectOutputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			ObjectOutputStream.PutField pf1 = stream.putFields();
+			ObjectOutputStream.PutField pf2 = stream.putFields();
+			if (pf1 != pf2)
+				throw new Error("Two different PutFields?!");
+			stream.writeFields();
+		}
+
+		private void readObject(ObjectInputStream stream) 
+			throws IOException, ClassNotFoundException
+		{
+			ObjectInputStream.GetField gf1 = stream.readFields();
+			ObjectInputStream.GetField gf2 = stream.readFields();
+			if (gf1 != gf2)
+				throw new Error("Two different GetFields?!");
+			this.x = gf1.get("x", 0);
+			this.y = gf1.get("y", 0);
+		}
+	}
+	private static void tryRead(Class c, byte[] bytes)
+	{
+		System.out.println(c.getName()+ ":");
+		try
+		{
+			System.out.println("  Deserializing from Test0001 stream...");
+			//System.out.println("Expecting a " +c.getName()+ " in stream...");
+			ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
+			Object o = ois.readObject();
+			if (!c.isInstance(o))
+				throw new Exception("Object '" +o+ "' is not an instance of " +c);
+			System.out.println("    OK. Got: " +o);
+		}
+		catch (Exception e)
+		{
+			System.out.println("    Exception: " +e.getClass().getName());
+			if (DEBUG) e.printStackTrace(System.out);
+		}
+	}
+
+	private static ByteArrayOutputStream generateBytes(Class c)
+	{
+		try
+		{
+			System.out.println("  Serializing " +c.getName());
+			ByteArrayOutputStream bo = new ByteArrayOutputStream(256);
+			ObjectOutputStream oos = new ObjectOutputStream(bo);
+			oos.writeObject(c.newInstance());
+			oos.close();
+			System.out.println("    OK: " +bo.size()+ " bytes");
+			return bo;
+		}
+		catch (Exception e)
+		{
+			System.out.println("    Exception: " +e.getClass().getName());
+			if (DEBUG) e.printStackTrace(System.out);
+			return null;
+		}
+	}
+	
+	private static void dumpBytes(byte[] b)
+	{
+		for (int i = 0; i < b.length; i++)
+		{
+			if ((0x00FF&b[i]) < 16)
+				System.out.print("0");
+			System.out.print(Integer.toHexString(b[i] & 0x00FF));
+			System.out.print(" ");
+			if (((i + 1) % 15) == 0)
+				System.out.println();
+		}
+		System.out.println();
+	}
+
+	private static byte[] mungeBytes(byte[] base, String srcStr, String replStr)
+	{
+		byte[] src = srcStr.getBytes();
+		byte[] repl = replStr.getBytes();
+		
+		if (src.length != repl.length)
+			throw new Error("Can't handle different length src/repl ("+src+ ", "+repl+")");
+
+		for (int i = 0; i < base.length; i++)
+		{
+			if (i > base.length - src.length)
+				throw new Error("Didn't find it... ran out of room.");
+
+			// found start
+			if (base[i] == src[0])
+			{
+				//System.out.println("Checking " +i+ "...");
+				int s = 0;
+				while (s < src.length)
+				{
+					if (base[i+s] != src[s])
+						break;
+					s++;
+				}
+				
+				// Found full match
+				if (s == src.length)
+				{
+					//System.out.println("Found src at " +i+ "...");
+					for (int r = 0; r < repl.length; r++)
+					{
+						base[i+r] = repl[r];
+					}
+					return base;
+				}
+			}
+		}
+		return null; // Never Reached
+	}
+
+	private static ByteArrayOutputStream canonicalOutput;
+	private static Class canonicalClass;
+
+	private static void checkClass(Class c)
+	{
+		// "fix" the canonical output so it looks like it was
+		// a serialization of the given class c.  Does the
+		// munge on a *copy* of the canonical bytes.
+		byte[] mungedOutput = mungeBytes(canonicalOutput.toByteArray(), 
+						 canonicalClass.getName(), 
+						 c.getName());
+		
+		if (DEBUG) dumpBytes(mungedOutput);
+		
+		// Expect an instance of c from mungedOutput
+		tryRead(c, mungedOutput);
+
+		// Hmm.. just for kicks
+		generateBytes(c);
+		System.out.println();
+	}
+
+	public static void main(String[] args)
+	{
+		// Canonical, correct format:
+		System.out.println("Generating canonical stream");
+		canonicalClass = Test0001.class;
+		canonicalOutput = generateBytes(Test0001.class);
+	
+		String canonName = canonicalClass.getName();
+		String checkName = canonName.substring(0, canonName.length() - 4); // strip version no.
+	
+		Class[] tests = TestSerialFields.class.getDeclaredClasses();
+		Arrays.sort(tests, new Comparator() {
+			public int compare(Object o1, Object o2)
+			{
+			    Class c1 = (Class)o1;
+			    Class c2 = (Class)o2;
+
+			    return c1.getName().compareTo(c2.getName());
+			}
+		    });
+
+		for (int i = 0; i < tests.length; i++)
+		{
+			if (tests[i].getName().startsWith(checkName))
+				checkClass(tests[i]);
+		}
+	}
+}
+
+/* Expected Output:
+Generating canonical stream
+  Serializing TestSerialFields$Test0001
+    put x: int=42 
+    put y: int=42 
+    OK: 132 bytes
+TestSerialFields$Test0001:
+  Deserializing from Test0001 stream...
+    x: int=42
+    y: int=42
+    OK. Got: TestSerialFields$Test0001 x=0; y=0; foo=0
+  Serializing TestSerialFields$Test0001
+    put x: int=42 
+    put y: int=42 
+    OK: 132 bytes
+
+TestSerialFields$Test0002:
+  Deserializing from Test0001 stream...
+    x: int=42
+    y: int=42
+    xd: (defaulted) double=0.0 
+    yd: (defaulted) double=0.0 
+    OK. Got: TestSerialFields$Test0002 instance
+  Serializing TestSerialFields$Test0002
+    put xd: double=6.9 
+    put yd: double=6.9 
+    OK: 73 bytes
+
+TestSerialFields$Test0005:
+  Deserializing from Test0001 stream...
+    x: int=42
+    y: int=42
+    OK. Got: TestSerialFields$Test0005 instance
+  Serializing TestSerialFields$Test0005
+    OK: 47 bytes
+
+TestSerialFields$Test0008:
+  Deserializing from Test0001 stream...
+    x: int=42
+    y: int=42
+    OK. Got: TestSerialFields$Test0008 instance
+  Serializing TestSerialFields$Test0008
+    put x: int=42 
+    put y: int=42 
+    OK: 63 bytes
+
+TestSerialFields$Test0010:
+  Deserializing from Test0001 stream...
+    x: int=42
+    y: int=42
+    xodd: (defaulted) Object=null
+    yodd: (defaulted) Object=null
+    OK. Got: TestSerialFields$Test0010 instance
+  Serializing TestSerialFields$Test0010
+    put xodd: string='putfield test string' 
+    put yodd: string='putfield test string' 
+    OK: 133 bytes
+
+TestSerialFields$Test0011:
+  Deserializing from Test0001 stream...
+    OK. Got: TestSerialFields$Test0011 instance
+  Serializing TestSerialFields$Test0011
+    Exception: java.io.NotActiveException
+
+TestSerialFields$Test0012:
+  Deserializing from Test0001 stream...
+    OK. Got: TestSerialFields$Test0012: 42,42
+  Serializing TestSerialFields$Test0012
+    OK: 63 bytes
+
+TestSerialFields$Test0014:
+  Deserializing from Test0001 stream...
+    Exception: java.lang.IllegalArgumentException
+  Serializing TestSerialFields$Test0014
+    Exception: java.lang.IllegalArgumentException
+
+TestSerialFields$Test0015:
+  Deserializing from Test0001 stream...
+    OK. Got: TestSerialFields$Test0015: 0,0
+  Serializing TestSerialFields$Test0015
+    OK: 108 bytes
+
+TestSerialFields$Test0016:
+  Deserializing from Test0001 stream...
+    OK. Got: TestSerialFields$Test0016: 42,42
+  Serializing TestSerialFields$Test0016
+    OK: 63 bytes
+
+*/
===================================================================
Checking out kaffe/test/regression/TestSerialPersistent.java
RCS:  /home/cvs/kaffe/kaffe/test/regression/TestSerialPersistent.java,v
VERS: 1.3
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/test/regression/TestSerialPersistent.java	Sat Dec 10 19:45:22 2005
@@ -0,0 +1,438 @@
+/*
+ * Test various definitions of the semi-magical 'serialPersistentFields' field.
+ *
+ * Copyright (c) 2002 Pat Tullmann
+ * All Rights Reserved.
+ *
+ * This file is released into the public domain.
+ *
+ * @author Pat Tullmann <pat_kaffe at tullmann.org>
+ */
+import java.io.*;
+import java.util.*;
+
+public class TestSerialPersistent
+{
+	private static class Default
+	implements Serializable
+	{
+		private int i;
+		private String s;
+
+		// No serialPersistentFields specification
+	}
+
+	private static class DefaultTransient
+	implements Serializable
+	{
+		private int i;
+		private String s;
+		transient private long not_expected_l;
+
+		// No serialPersistentFields specification
+	}
+
+	private static class Subset
+	implements Serializable
+	{
+		private int i;
+		private String s;
+		private long not_expected_l;
+
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			new ObjectStreamField("i", int.class),
+			new ObjectStreamField("s", String.class)
+		};
+	}
+
+	private static class Subclass
+	extends Subset
+	implements Serializable
+	{
+		private int xi;
+		private String xs;
+		private long not_expected_xl;
+
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			new ObjectStreamField("xi", int.class),
+			new ObjectStreamField("xs", String.class)
+		};
+	}
+
+	private static class FieldSort
+	implements Serializable
+	{
+		private int ib;
+		private int ia;
+		private String sb;
+		private int ic;
+		private String sa;
+
+		// Real fields should be sorted prim before ref, then alpha
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			new ObjectStreamField("ic", int.class),
+			new ObjectStreamField("ib", int.class),
+			new ObjectStreamField("sa", String.class),
+			new ObjectStreamField("sb", String.class),
+			new ObjectStreamField("ia", int.class)
+		};
+	}
+
+	private static class TransientOverlap
+	implements Serializable
+	{
+		private int i;
+		transient private String s;
+		transient private long not_expected_l;
+		
+		// Seems this list takes precedence over 'transient' keyword
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			new ObjectStreamField("i", int.class),
+			new ObjectStreamField("s", String.class)
+		};
+	}
+
+	private static class ContainsNull
+	implements Serializable
+	{
+		private int i;
+		private String s;
+		
+		// A null entry should make serialization impossible
+		private static final ObjectStreamField[] serialPersistentFields =
+		{
+			null,
+			new ObjectStreamField("s", String.class)
+		};
+	}
+
+	private static class IsNull
+	implements Serializable
+	{
+		private int i;
+		private String s;
+		
+		// A null definition is just ignored?
+		private static final ObjectStreamField[] serialPersistentFields = null;
+	}
+
+	private static class IsNoFieldsMagic
+	implements Serializable
+	{
+		private int i;
+		private String s;
+		
+		// Check the ObjecStreamClass.NO_FIELDS magic
+		private static final ObjectStreamField[] serialPersistentFields = ObjectStreamClass.NO_FIELDS;
+	}
+
+	private static class NonPrivate
+	implements Serializable
+	{
+		private int expected;
+
+		// bogus contents should be silently ignored
+		public static final ObjectStreamField[] serialPersistentFields =
+		{
+			null,
+			new ObjectStreamField("xxxx", void.class),
+		};
+	}
+
+	private static class WrongType

*** Patch too long, truncated ***



More information about the kaffe mailing list