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

How can I call the constructor before deserialisation?

我尝试通过数据协定序列化对自定义 class 进行序列化和反序列化。 序列化效果很好。但是,在反序列化时,我 运行 遇到了问题,因为这个 (source):

Constructors are not called when objects are deserialized.

问题是我在构造函数中做了一些初始化。 这包括一些数据结构。

如果不调用构造函数,数据结构是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 序列化吗?

创建一个带有签名的构造函数

protected YourClassName(SerializationInfo info, StreamingContext context)
{
}

并让您的 class 实施 ISerializable。在序列化时,它在 de-serialization 上调用 ISerializable.GetObjectData(),它调用上面的构造函数。

请参阅 MSDNCustom Serialization: Implementing the ISerializable Interface

如果您实际上不需要 a 在构造函数中完成工作,您可以使用属性 [OnDeserializing] 而不是 [OnDeserialized] 来完成工作 before反序列化而不是after.

[OnDeserializing]
private void SetValuesOnDeserializing(StreamingContext context)
{
    // Code not shown.
}

注意:如果您的对象图中有多个 [OnDeserializing] 方法,则它们的调用顺序不是确定的。