【发布时间】:2016-01-07 16:35:46
【问题描述】:
我尝试通过数据协定序列化对自定义类进行序列化和反序列化。 序列化效果很好。但是,在反序列化时,我遇到了一个问题,因此(source):
反序列化对象时不调用构造函数。
问题是我在构造函数中做了一些初始化。 这包括一些数据结构。
不调用构造函数,数据结构为null,反序列化期间调用setter函数失败。
在反序列化过程之前或期间,如何在使用任何访问器之前调用构造函数或初始化对象?
我可以通过属性将一些方法声明为回调,如下所示(同一来源):
// This method is called after the object
// is completely deserialized. Use it instead of the
// constructror.
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
fullName = firstName + " " + lastName;
}
但看起来它们都是在在反序列化之后触发的。
我必须切换到 XML 序列化吗?
【问题讨论】:
-
这应该在您序列化对象之前已经发生。所以再做一次就错了。
-
是的,使用
OnDeserialized方法可以初始化您的字段。在此之前没有任何东西可以访问这些字段/属性。 -
@HansPassant 反序列化是独立发生的。在程序的执行过程中,我只加载序列化的数据,并希望将其反序列化为一个对象。序列化甚至没有在反序列化之前发生(在这个程序实例中)。在此之前我不太确定如何调用构造函数。
-
@SriramSakthivel 这是不正确的。同样,cmets 声明它发生在反序列化之后,我的结果同意这一点:在调用函数之前使用访问器。我不能用它来初始化字段。
标签: c# serialization deserialization datacontractjsonserializer