反序列化期间对象会发生什么?

时间:2016-11-22 12:50:36

标签: c# .net serialization

我对OnDeserializing属性有疑问。我有一节课:

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

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

序列化工作完全正常,但OnDeserializationMethod中的代码打印“-3”。

谁能告诉我为什么会这样?

2 个答案:

答案 0 :(得分:0)

发生这种情况的原因是您设置了序列化字段的默认值,因此字段{{1}}设置为-3。每Documentation on OnDeserializingAttribute

  

使用{{1}}设置默认值   反序列化。例如,如果要反序列化的类型   不包含构造函数,创建一个设置任何值的方法   实例中的字段并将该属性应用于方法。

答案 1 :(得分: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。