7

SCJP6学習ガイドから-シリアル化に関する次のコードの出力を求める質問があります。

import java.io.*;

public class TestClass {
  static public void main(String[] args) {
    SpecialSerial s = new SpecialSerial();
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myFile"));
        os.writeObject(s);
        os.close();
        System.out.print(++s.z + " ");
        s = null;  // makes no difference whether this is here or not

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("myFile"));
        SpecialSerial s2 = (SpecialSerial)is.readObject();
        is.close();
        System.out.println(s2.y + " " + s2.z);
    } catch (Exception e) {e.printStackTrace();}
  }
}
class SpecialSerial implements Serializable {
    transient int y = 7;
    static int z = 9;
}

これの出力は次のとおりです。10010

この理由は、静的変数zがシリアル化されていないためです。これは、私が予想していなかったことです。

静的int変数zの値は、オブジェクトがファイルに書き込まれた後、println()ステートメントで10にインクリメントされます。

この場合、クラスが逆シリアル化されたときに元の値の9に戻らないのはなぜですか、またはクラスが通常の方法で作成されていないため、クラスのデフォルトのint値は0のままではなく、 -逆シリアル化後のデフォルトの増分値は10ですか?10であるという価値は失われると思っていたでしょうが、そうではありません。

誰かが光を当てますか?私はこれに私のつま先を突き刺している暗闇の中でこの辺りでつまずきます。

4

2 に答える 2

3

基本的に、インスタンスはクラスではなくシリアル化されます。クラスによって宣言された静的フィールドは、クラスのインスタンスのシリアル化/逆シリアル化の影響を受けません。にzリセットする9には、クラスをリロードSpecialSerialする必要がありますが、これは別の問題です。

于 2012-11-11T23:50:20.587 に答える
2

の値はクラスs2.zの静的メンバーの値であるため、z10SpecialSerialのままzです。インスタンスではなくクラスによって制限されます。

それはあなたがこれをしたかのようです

++SpecialSerial.z
System.out.println(SpecialSerial.z)

それ以外の

++s.z
System.out.println(s2.z)
于 2012-11-11T23:51:53.447 に答える