如何在取消序列化之前调用构造函数

本文关键字:调用 构造函数 序列化 取消 | 更新日期: 2023-09-27 18:29:19

我尝试通过数据协定序列化来序列化和反序列化自定义类。连载效果很好。然而,当反序列化时,我遇到了一个问题,因为这个(来源):

反序列化对象时不调用构造函数。

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

如果没有对构造函数的调用,则数据结构为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)
{
}

并让您的类实现CCD_ 2。在序列化时调用ISerializable.GetObjectData(),在反序列化时调用上述构造函数。

请参阅自定义序列化:在MSDN 上实现ISerializable接口

如果您实际上不需要在构造函数中执行工作,则可以使用属性[OnDeserializing]而不是[OnDeserialized]来在反序列化之前而不是之后完成的工作。

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

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