我尝试通过数据合同序列化序列化和反序列化自定义类。 序列化效果很好。但是,在反序列化时,我遇到了一个问题,因为这个(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序列化?
答案 0 :(得分:3)
使用签名
创建构造函数protected YourClassName(SerializationInfo info, StreamingContext context)
{
}
让您的班级实施ISerializable
。在序列化时,它在反序列化时调用ISerializable.GetObjectData()
,它调用上面的构造函数。
请参阅MSDN上的Custom Serialization: Implementing the ISerializable Interface
如果您实际上不需要在构造函数中执行该工作,则可以使用属性[OnDeserializing]
代替[OnDeserialized]
来完成反序列化前的工作之后。
[OnDeserializing]
private void SetValuesOnDeserializing(StreamingContext context)
{
// Code not shown.
}
注意:如果对象图中有多个[OnDeserializing]
方法,则调用它们的顺序不是非对称的。