0

「シリアライゼーションは静的要素用ではありません」と読みましたが、以下の簡単な例はそうではないことを示しています。

class superparent implements Serializable {
    int data = 0;

    public superparent(int data) {
        this.data = data;
    }

    public int getdata() {
        return data;
    }
}

public class statichost implements Serializable {
    int member = 0;
    public static superparent s = new superparent(20);

    public statichost(int data) {
        this.member = data;
    }

    public static void main(String[] args) {
        statichost c = new statichost(6);
        try {
            FileOutputStream fs = new FileOutputStream("testSer.ser");
            ObjectOutputStream os = new ObjectOutputStream(fs);
            os.writeObject(c);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            FileInputStream fis = new FileInputStream("testSer.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            c = (statichost) ois.readObject();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("after: contained data is " + c.s.getdata());
    }
}

上記のステートメントに従って 0 を期待していた場合、出力は 20 を出力します。何か不足していますか?

4

3 に答える 3

2

ここで異常なことは何も起きていません。クラスの静的メンバー変数を宣言しましたstatichost。この変数は、クラスのロードのトリガーに関係なく、クラスが JVM によってロードされるときに初期化されます。

statichostインスタンスではなくクラスに関連付けられているため、インスタンスのシリアライズとデシリアライズは静的フィールドには影響しません。これをテストする場合は、シリアライゼーションとデシリアライゼーションを異なるブロックに分割し、次の手順を実行します。

  • statichostインスタンスをシリアライズする
  • superparent20 ではなく 15 で初期化されるようにクラスを変更します。
  • statichostインスタンスをデシリアライズする

c.s.getdata()静的フィールドがシリアル化されている場合、20 が報告されると予想されますが、 15 が報告されます。

于 2012-11-26T06:10:01.890 に答える
2

int data=0;あなたのクラスの静的メンバーではないためsuperparentです。

また、この推奨事項を忘れた場合は、クラス名は大文字で始める必要があることを指摘したいと思います

于 2012-11-26T06:00:54.470 に答える
0

テスト コードではこの状況を確認できないと思います。クラスの初期化で20 が設定されるためpublic static superparent s=new superparent(20);、クラスロード時に JVM によって常に 20 に設定されます。

初期データを 0 にして、データの 20 への変更をシリアル化できないことを確認する場合は、試してください。

  1. public static superparent s=new superparent(0);初期値として 20 の代わりに使用します。
  2. 最初の実行の readObject try-catch ブロックをコメントアウトし、最初の try-catch ブロックに変更コードcsdata=20を追加してファイルに書き込み、コードを実行します。
  3. 2 回目の実行で writeObject の try-catch ブロックをコメントアウトし、読み込んだ Object コードを再度実行します。次に、20 をファイルにシリアル化できないことがわかります。0 が出力されます。
于 2012-11-26T06:19:33.393 に答える