2012-11-11 10 views
7

- 直列化に関する以下のコードの出力を尋ねる質問があります:静的クラス変数とSCJP 6研究ガイドからシリアライズ/デシリアライゼーションの

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; 
} 

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

これは、静的変数zがシリアル化されていないことが原因であると考えられています。

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

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

誰かが何か光を放つのですか?私は暗闇の中でここにつまずいています。

答えて

3

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

+0

Aaahhのこの

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

をやったかのようにそれはもちろんそうああ...だ - クラス自体は、それのインスタンスがない場合でも、ロードされたままになります。ああ、はい、今は完璧な意味があります。どうもありがとう! :-) –

2

s2.zの値がSpecialSerialクラスの静的メンバzの値であり、それは10 zをとどまる理由です、インスタンスクラスで囲まれた、とされていません。

あなたの代わりに

++s.z 
System.out.println(s2.z) 
+0

クール - ありがとう。今や意味をなさない:-) –

関連する問題