0

以下のクラスのインスタンスをシリアライズ、送受信しようとしています ( 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();

    }
}

その中の TestClass の定義は次のとおりです。

import java.io.Serializable;


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

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

    }
}

..... オブジェクトは次のように送信されます。

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

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

AppendingObjectOutputStream の定義は次のとおりです。

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 

受信側では、次の例外がスローされます。

> 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)

ServerGameDataObject 内で t2 を一時的 (transient private TestClass t2 =null; ) と定義した場合、オブジェクトを受け取ります。

どうしたの?t1 と t2 の両方を受信できないのはなぜですか?

4

1 に答える 1

0

ここでミス多数。

  1. 最初の書き込みには法線ObjectOutputStreamを使用し、追加する場合にのみ追加バージョンを使用する必要があります。出力がソケットの場合、ソケットの存続期間中同じものを使用する方が本当に理にかなってObjectOutputStreamいます。

  2. readObject()EOSに戻らないでくださいreadUnshared()null彼らは投げEOFExceptionます。したがって、null を返さない間にループするのは正しくありません。

于 2013-05-10T12:36:43.877 に答える