如何在反序列化之前调用构造函数?

时间:2016-01-07 16:35:46

标签: c# serialization deserialization datacontractjsonserializer

我尝试通过数据合同序列化序列化和反序列化自定义类。 序列化效果很好。但是,在反序列化时,我遇到了一个问题,因为这个(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序列化?

1 个答案:

答案 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]方法,则调用它们的顺序不是非对称的。