0

最近、OCPJP7 試験の準備をするために、シリアライゼーションで少し遊んでいました。したがって、次のクラスをシリアル化しようとしました。

class TempClass  implements Serializable {  
        int secCounter;   
        static int counter;  
        {  
                counter++;  
        }  
        {  
        secCounter=counter;  

次に、次のようにオブジェクトを a に書き込もうとするFileOutputStreamと:

TempClass temp = new TempClass();  
ObjectOutputStream obi = new ObjectOutputStream(new FileOutputStream(file));   
obi.writeObject(temp);  
obi.writeUnshared(temp);  
obi.writeUnshared(temp);  

したがって、ここで を使用して読み戻すと、3 つの異なるオブジェクトが取得されるObjectInputStreamため、3 つのオブジェクトが作成されます。secCounterただし、インスタンス変数であるためシリアル化できるの最終値は、3 ではなく 1 です。1 は、newキーワードを呼び出した回数です。 obi.writeUnshared(object). 正確に何が起こるか知っている人はいますか?静的変数がシリアル化されていないことはわかっていますが、上記の投稿されたコードでは、値を静的変数からインスタンス変数にコピーしましたsecCounter。したがって、最終的にsecCounterどの値が正常にシリアル化されているかを確認しても、(少なくとも私にとっては) 期待される結果は得られませんが、1 です。

前もって感謝します。

4

2 に答える 2

0

逆シリアル化コンストラクター(またはあなたの場合のようにイニシャライザー)は実行されません。これは、オブジェクトを逆シリアル化するときに、オブジェクトの内部状態が元のオブジェクトの状態と同じであると予想される可能性が高いためです。初期化子またはコンストラクターを実行すると、オブジェクトの内部状態を変更するなどの「副作用」が発生する可能性があります。

于 2013-08-03T09:24:38.263 に答える