-2

シリアル化を行っていますが、次のことを理解できません。

このコードの出力が次のようになる理由がわかりません。

import java.io.*;

public class InnerOuterTest {
    public static ObjectOutputStream out;
    public static ObjectInputStream in;

    static {
        try {
            out = new ObjectOutputStream(new FileOutputStream("save.ser"));
            in = new ObjectInputStream(new FileInputStream("save.ser"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        try {
            ShouldForgive f = new ShouldForgive();
            f.x = 5;
            write(f);
            ShouldForgive g = read();
            System.out.println(g.x);
            f.x = 0;
            g.x=8;
            write(f);
            ShouldForgive v = read();
            System.out.println("is "+v.x);
        } finally {
            out.close();
            in.close();
        }
    }

    private static void write(ShouldForgive f) throws IOException {
        out.writeObject(f);
    }

    public static ShouldForgive read() throws ClassNotFoundException, IOException {
        return (ShouldForgive) in.readObject();
    }
}

class ShouldForgive implements Serializable {
    int x = -1;
}

5
8

そしてそうではない

5
0

f == gfalse を返すものと、入力ストリームをリセットした場合を試しました。実装readObjectすると、一度しか呼び出されないことがわかりました...この動作がわかりません。(オブジェクトが 1 回だけ読み取られるのはなぜですか?)

シリアル化が 1 回しか行われないような気がします... オブジェクトはどのように追跡されますか? 実装しても、ファイルから実際に読み書きしなくても、まだ得られreadObjectますwriteObject8

4

2 に答える 2

2

最初の書き込みの後に呼び出すとout.reset()、期待する動作が得られます。または、writeUnshared()の代わりにを使用した場合writeObject()。すでにストリームに書き込まれているオブジェクトは書き換えられません。代わりに、以前に書き込まれたオブジェクトへの「ハンドル」が書き込まれます。詳細については、Javadocを参照してください。

于 2012-06-30T01:57:38.353 に答える
-1

OK...わかったと思う...

  1. シリアル化中は、シリアル化されるオブジェクトではなく、インスタンス変数...が抽出および保存されます。オブジェクトの場合、そのインスタンス変数はすべてです...

  2. したがって、逆シリアル化中に、同じインスタンス変数がインフレートされ、それらのインスタンス変数値を使用して、別の同一のオブジェクトがヒープ上に作成されます。

  3. これら両方のオブジェクトのハッシュコードを確認すると、それらは異なります。

それがあなたが言及した上記の振る舞いを引き起こしています。

このシーケンスに従ってください

f.x = 0;
g.x=8;

またはこれ

g.x=8;       
f.x = 0; 

それでも結果は8になり、ヒープ上のオブジェクトが完全に異なり、インスタンス変数が異なります。

編集部分

The below code will print f as 5..... for both the sysout

public static void main(String[] args) throws IOException, ClassNotFoundException {
        try {
            ShouldForgive f = new ShouldForgive();
            f.x = 5;
            write(f);
            ShouldForgive g = read();
            System.out.println(g.x);

            f.x=0;
            write(f);
            ShouldForgive v = read();
            System.out.println("is "+v.x);
        } finally {
            out.close();
            in.close();
        }
    }
于 2012-06-29T15:48:41.643 に答える