0

I am trying to serialize, send and receive an instance of the below class ( ServerGameDataObject object = new ServerGameDataObject() )

public class ServerGameDataObject implements Serializable {
    private static final long serialVersionUID = 5410058267505412928L;

    private TestClass t1 =null;
    private TestClass t2 =null;

    public ServerGameDataObject(){

        t1 = new TestClass();
        t2 = new TestClass();

    }
}

The definition of TestClass in it is :

import java.io.Serializable;


public class TestClass  implements Serializable{
    transient public static final long serialVersionUID = -3089302783006861199L;

    private int val =-1;
    public  TestClass(){
        val=-1;

    }
}

..... The object is sent as follows:

    ObjectOutputStream o = new AppendingObjectOutputStream(
            <some outputstream>);

    o.writeUnshared(object);
    o.flush();

The definition of AppendingObjectOutputStream is:

public class AppendingObjectOutputStream extends ObjectOutputStream {

    public AppendingObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    @Override
    protected void writeStreamHeader() throws IOException {
        // do not write a header, but reset:
        // this line added after another question
        // showed a problem with the original
        reset();
    }

}



 The code on the receiving end is :

    Object o = null;
   while ((o = inputStream.readUnshared()) != null) { // this is Receiver.java, line 74
    ...
    }

inputStream is an instance of ObjectInputStream 

On the receiving end this exception is thrown:

> 05-10 10:54:51.572: E/AndroidRuntime(3133): FATAL EXCEPTION:
> Thread-134 05-10 10:54:51.572: E/AndroidRuntime(3133):
> java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast
> to java.lang.String 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readFieldDescriptors(ObjectInputStream.java:935)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:1744)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1656)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1806)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1140)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1372)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1269)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1858)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readUnshared(ObjectInputStream.java:1978)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> Receiver.run(Receiver.java:74)

If inside ServerGameDataObject I define t2 to be transient (transient private TestClass t2 =null; ), then I DO REICEIVE the objects

What's wrong? Why can i NOT receive both t1 and t2 ?

user1386187
  • 31
  • 1
  • 4

1 Answers1

0

Numerous mistakes here.

  1. You must use a normal ObjectOutputStream for the first write, and the appending version only when you are appending. If the output is a socket it really makes more sense just to use the same ObjectOutputStream for the life of the socket.

  2. readObject() and readUnshared() don't return null at EOS. They throw EOFException. So looping while they don't return null is incorrect.

user207421
  • 305,947
  • 44
  • 307
  • 483
  • 1. I do that already above is obtained after the first write 2. I will look into it. Regardless, the application works when one of the two TestClasses is transient. I need to get it working when none is transient. – user1386187 May 10 '13 at 15:12
  • In that case the class that doesn't work probably has an incorrect readObject() or writeObject() method. – user207421 May 10 '13 at 23:05