0

ソケットを使用して ObjectOutputStream 経由でオブジェクトをロードしようとしています。

同じマシンでテストしています。

次のエラーが表示されます。

java.io.StreamCorruptedException: invalid type code: 00
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)

このコードを使用して ObjectOutputStream を作成します。

InputStream in = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = new ObjectInputStream(in);
Object readObject = objectInputStream.readObject();

さらに奇妙なのは、それほど大きくないオブジェクトを渡すときに問題がないことです。

問題を返すオブジェクトのバイト単位のサイズは、約 73423 バイトです。

ObjectOutputStream 経由で java.util.Vector を渡します。

5 を超える値を渡すと、上記の例外がスローされます。

また、オブジェクトがシリアライズ可能であることを確認するための簡単なテスト (ソケットを通過しない) も作成しました。問題なく動作します。NNTraining は、私がシリアライズしているクラスです。

    Vector<NNTraining> nn = new Vector<NNTraining>();
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o = new ObjectOutputStream(b);
    o.writeObject(nn);
    o.close();
    ByteArrayInputStream bb = new ByteArrayInputStream(b.toByteArray());
    ObjectInputStream oo = new ObjectInputStream(bb);
    Vector<NNTraining> v2 = (Vector<NNTraining>) oo.readObject();
4

1 に答える 1

0

バイト配列と ByteArrayInputStreams をいじる必要はありません。一度 ObjectInputStream をソケットに直接アタッチし、必要なときに readObject() を呼び出すだけです。送信側で、ObjectOutputStream を一度ソケットに直接アタッチし、必要なたびに writeObject() を呼び出します。

あなたが得ている問題は、あなたがこれをしていないからです。

于 2013-05-02T21:40:04.747 に答える