Is serialization broken?
Barnet Wagman
wagman@enteract.com
Fri Jan 26 00:14:00 GMT 2001
I'm getting an erroneous ClassCastException deserializing an object with
gcj,ÃÂ gcc version 2.97 20010117 (experimental).
With the test program SerTest.java (below), I do the following
ÃÂ
bash-2.03$ gcj -C SerTest.java
bash-2.03$ gcj --main=SerTest SerTest.class
bash-2.03$ a.out S
1000ÃÂ 1000ÃÂ 1000.0 10
T he serialization file gets created, but on deserialization:
bash-2.03$ a.out D
IOException from util.SerializeU.deserializeObject(): java.io.IOException
Exception in thread "main" java.lang.ClassCastException
ÃÂ ÃÂ at 0x401991ca: java::lang::Throwable::Throwable()
(/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x4018cc9d: java::lang::Exception::Exception()
(/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x401911dd: java::lang::RuntimeException::RuntimeException()
(/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x4018af5d: java::lang::ClassCastException::ClassCastException()
(/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x401782ab: _Jv_CheckCast (/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x0804c484: SerTest::main(JArray<java::lang::String*>*)
(/home/moi/GCJ_JavaTree/SerTest.class:0)
ÃÂ ÃÂ at 0x4017498b: gnu::gcj::runtime::FirstThread::run()
(/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x4017facb: java::lang::Thread::run_(java::lang::Object*)
(/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x402a0d5a: _Jv_ThreadStart(java::lang::Thread*,
int*, void (*)(java::lang::Thread*)) (/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x4017fbff: java::lang::Thread::start() (/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x4015dea2: JvRunMain (/usr/local/gcc/lib/libgcj.so.1)
ÃÂ ÃÂ at 0x0804cea3: main (/tmp/ccJoVWObmain.i:0)
ÃÂ ÃÂ at 0x40473a5e: __libc_start_main (/lib/libc.so.6)
ÃÂ ÃÂ at 0x08049a91: _start (??:0)
Any thoughts or suggestions?
Thanks,
Barnet
i mport java.util.*;
import java.io.*;
ÃÂ
public class SerTest implements Serializable {
ÃÂ ÃÂ ÃÂ HashMap hm;
ÃÂ ÃÂ ÃÂ double[] v;
ÃÂ ÃÂ ÃÂ public SerTest() {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ hm = new HashMap();
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ v = new double [1000];
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ for ( int i = 0; i <
v.length; i++ ) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
v[i] = ((double) i) * 100.0;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
hm.put(new Integer(i), new Integer(i));
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ public static void main(String[] argv) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ SerTest st = null;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ if ( argv.length ==
1 ) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
if ( argv[0].equals("S") ) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
st = new SerTest();
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
serializeObject(st,"/home/moi/GCJ_JavaTree/xxx.ser");
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
}
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
else if ( argv[0].equals("D") ) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
st = (SerTest) deserializeObject("/home/moi/GCJ_JavaTree/xxx.ser");
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
}
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
System.err.println(st.hm.size() + "ÃÂ " + st.v.length + "ÃÂ " +
st.v[10] + " "
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
+ st.hm.get(new Integer(10)) );
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ public static boolean serializeObject(Object
obj, String filename) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
// If the file already exists, delete it.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ File f = new File(filename);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ if ( f.exists() )
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
f.delete();
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ try {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
FileOutputStream fos = new FileOutputStream(filename);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
ObjectOutputStream oos = new ObjectOutputStream(fos);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
oos.writeObject(obj);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
oos.flush();
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
fos.close();
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ catch (IOException
e) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
System.err.println("IOException " + e );
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
return(false);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ return(true);
ÃÂ ÃÂ ÃÂ }
ÃÂ
ÃÂ ÃÂ ÃÂ public static Object deserializeObject(String
filename) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ try {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
FileInputStream fis = new FileInputStream(filename);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
ObjectInputStream ois = new ObjectInputStream(fis);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
Object obj = ois.readObject();
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
ois.close();
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
return(obj);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ catch (FileNotFoundException
e) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
System.err.println("FileNotFoundException " + e );
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ catch (IOException
ex) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
System.err.println("IOException " + ex );
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ catch (ClassNotFoundException
ec) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
System.err.println("ClassNotFoundException " + ec );
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ return(new Object());
ÃÂ ÃÂ ÃÂ }
}
More information about the Java
mailing list