[kaffe] java.io.ObjectInputStream: final field cannot be restored

Ito Kazumitsu ito.kazumitsu@hitachi-cable.co.jp
Tue Mar 23 22:02:02 2004


Hi,

Interested in Prevayler (http://www.prevayler.org/), which is
marked untested in our "Compatibility - Application Testing",
I tried it.

The result was unsatisfactory.  The simplest demo of Prevayler
cannot run on kaffe.  After studying the cause of the error,
I found something buggy in java.io.ObjectInputStream.

My test program is attaced below.  The test shows that a
field that is marked "final" cannot be restored by
java.io.ObjectInputStream#readObject.

I tested it on kaffe 1.1.4,  but I have not tested it on the current
CVS version yet.

Results:

The VM on which              The VM
ObjectOutputStream ran       ObjectInputStream ran     Result
----------------------       ---------------------     ------
Kaffe 1.1.4                  Kaffe 1.1.4               FAIL(1)
Sun's 1.4.2_04               Sun's 1.4.2_04            PASS(2)
Kaffe 1.1.4                  Sun's 1.4.2_04            PASS(3)
Sun's 1.4.2_04               Kaffe 1.1.4               FAIL(4)

(1) Kaffe --> Kaffe
$bash java Test01 write | java Test01 read
t2=Test01@8291b64 null B
t1=Test01@81459b4 A B

(2) Sun --> Sun
bash$ java Test01 write | java Test01 read
t1=Test01@f9f9d8 A B
t2=Test01@1820dda A B

(3) Kaffe --> Sun
bash$ java Test01 write | (Some command that sends data to another machine)
t1=Test01@81459b4 A B

bash$ (Some command that received data from another machine) | java Test01 read
t2=Test01@1820dda A B

(4) Sun --> Kaffe
bash$ java Test01 write | (Some command that sends data to another machine)
t1=Test01@f9f9d8 A B

$ (Some command that received data from another machine) | java Test01 read
t2=Test01@8291b64 null B

Test program:
import java.io.*;
import java.util.*;
class Test01 implements java.io.Serializable {

  private final String s1 = "A";
  private String s2 = "B";

  public static void main(String args[]) throws Exception {
    if (args[0].equals("write")) {
      Test01 t1 = new Test01();
      ObjectOutputStream stream = new ObjectOutputStream(System.out);
      stream.writeObject(t1);
      stream.flush();
      System.err.println("t1=" + t1 + " " + t1.s1 + " " + t1.s2);
      return;
    }
    if (args[0].equals("read")) {
      ObjectInputStream ois = new ObjectInputStream(System.in);
      Test01 t2 = (Test01)(ois.readObject());
      System.err.println("t2=" + t2 + " " + t2.s1 + " " + t2.s2);
      return;
    }
  }
}