1

プログラムをテストしようとしています。そのためにReadExternal関数にアクセスする必要がありますが、ObjectInputStreamでStreamCorrupted例外が発生します。WriteObjectによって作成されたオブジェクトを使用する必要があることはわかっていますが、その方法がわかりません...

ObjectOutputStream out=new ObjectOutputStream(new ByteArrayOutputStream());
    out.writeObject(ss3); 
    ss3.writeExternal(out);
    try{
         ByteInputStream bi=new ByteInputStream();
         bi.setBuf(bb);
         out.write(bb);
         ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bb));
         String s1=(String) in.readObject();
        }
        catch(Exception e){
            e.printStackTrace();
        }
4

2 に答える 2

6

どうやら、出力ストリームに同じオブジェクトを 2 回書き込もうとしているようです。

out.writeObject(ss3); 
ss3.writeExternal(out); // <-- Remove this!

2 番目の書き込みはwriteExternal()メソッドの間違った使い方をしています。明示的に呼び出すべきではありませんが、ObjectOutputStream.

And:out.write(bb);の内容を に書き込もうとしbbますObjectOutputStream。それはおそらくあなたが望むものではありません。

次のようにしてみてください。

// Create a buffer for the data generated:
ByteArrayOutputStream bos = new ByteArrayOutputStream();

ObjectOutputStream out=new ObjectOutputStream( bos );

out.writeObject(ss3);

// This makes sure the stream is written completely ('flushed'):
out.close();

// Retrieve the raw data written through the ObjectOutputStream:
byte[] data = bos.toByteArray();

// Wrap the raw data in an ObjectInputStream to read from:
ByteArrayInputStream bis = new ByteArrayInputStream( data );
ObjectInputStream in = new ObjectInputStream( bis );

// Read object(s) re-created from the raw data:
SomeClass obj = (SomeClass) in.readObject();

assert obj.equals( ss3 ); // optional ;-)
于 2012-11-12T17:17:12.653 に答える
0

ss3.writeExternal(アウト);

そのメソッドを直接呼び出すべきではありません。あなたは電話しているはずです

out.writeObject(ss3);
于 2013-05-14T10:12:07.500 に答える