2016-11-22 88 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期间 反序列化设置的默认值。例如,如果反序列化的类型 不包含构造函数,请创建一个方法来设置实例中任何 字段的值,并将该属性应用于该方法。

相关问题