1

我尝试通过数据合同序列化序列化和反序列化自定义类。序列化效果很好。但是,在反序列化时,我遇到了一个问题,因为这个(来源):

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

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

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

4

1 回答 1

3

使用签名创建构造函数

protected YourClassName(SerializationInfo info, StreamingContext context)
{
}

并让你的班级实施ISerializable。在序列化它调用ISerializable.GetObjectData()反序列化它调用上面的构造函数。

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

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

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

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

于 2016-01-07T16:41:17.553 回答