2016-11-22 8 views
1

OnDeserializing属性に関する質問があります。私はクラスを持っています:デシリアライズ時にオブジェクトにはどうなりますか?

[Serializable] 
public class Test 
{ 
    int tmp = 10; 

    [OnDeserializing] 
    internal void OnDeserializingMethod(StreamingContext context) 
    { 
     tmp -= 3; 
     Console.WriteLine("{0}", tmp); 
    } 
} 

シリアル化はうまくいきますが、OnDeserializationMethodのコードは "-3"を出力します。

誰も私にその理由を教えてもらえますか?

答えて

0

デシリアライズ時にコンストラクタが実行されないということです。

public class Foo 
{ 
    int test = 10; 
} 

が実際にこれにコンパイルさ:

あなたは、このコードを参照

public class Foo 
{ 
    int test; 

    public Foo() 
    { 
     test = 10; 
    } 
} 

をしかし、そのコンストラクタが実行されていないため、すべてのメンバ変数はで、そのデフォルト値でスタートint testのケースは0である。

したがって、デシリアライザはOnDeserializingMethod()を呼び出し、testは3を減じて0-3 = -3となる。

0

これは、シリアル化されたフィールドのデフォルト値を設定しているため、フィールドtmpが-3に設定されるためです。 Documentation on OnDeserializingAttribute

パー 直列化復元時にデフォルト値を設定するOnDeserializingAttributeを使用してください。たとえば、 を逆シリアル化する型にコンストラクタが含まれていない場合は、インスタンス内の任意の フィールドの値を設定し、その属性をメソッドに適用するメソッドを作成します。

関連する問題