我对OnDeserializing
属性有疑问。我有一节课:
[Serializable]
public class Test
{
int tmp = 10;
[OnDeserializing]
internal void OnDeserializingMethod(StreamingContext context)
{
tmp -= 3;
Console.WriteLine("{0}", tmp);
}
}
序列化工作完全正常,但OnDeserializationMethod中的代码打印“-3”。
谁能告诉我为什么会这样?
答案 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。