12

オブジェクトを文字列にシリアル化し、逆シリアル化する必要があります。

私はstackoverflowで提案を読み、このコードを作成しました:

class Data implements Serializable {
int x = 5;
int y = 3;   
}

public class Test {
public static void main(String[] args) {

    Data data = new Data();

    String out;

    try {
        // zapis
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);

        oos.writeObject(data);

        out = new String(baos.toByteArray());
        System.out.println(out);

        // odczyt.==========================================

        ByteArrayInputStream bais = new ByteArrayInputStream(out.getBytes());

        ObjectInputStream ois = new ObjectInputStream(bais);

        Data d = (Data) ois.readObject();

        System.out.println("d.x = " + d.x);
        System.out.println("d.y = " + d.y);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}

}

しかし、私はエラーが発生します:

java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
at p.Test.main(Test.java:37)

なんで?私は予想した: dx = 5 dy = 3

どうすればうまくいく?ああ。このオブジェクトをファイルに書き込みたくありません。文字列形式にする必要があります。

4

2 に答える 2

10


ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());の代わりに を 使用しますByteArrayInputStream bais = new ByteArrayInputStream(out.getBytes());。これは、文字列変換によってデータが破損するためです (エンコーディングが原因で)。

結果を文字列に格納する必要がある場合は、任意のバイトを文字列に安全に格納する方法が必要です。それを行う 1 つの方法は、Base64 エンコーディングです。

まったく異なるアプローチは、このクラスに標準の Java シリアライゼーションを使用せず、独自の Data to String コンバーターを作成することでした。

于 2012-11-26T15:51:06.653 に答える