从IsolatedStorage反序列化时,不要调用对象构造函数

时间:2013-01-03 17:30:39

标签: c# constructor deserialization windows-phone-8 isolatedstorage

在我的WP8应用程序中,我有一种特殊类型的“设置”对象存储在IsolatedStorageSettings.ApplicationSettings中。这些对象在其构造函数中设置了一些初始状态,并且该状态可能会在以后更改。

现在的问题是,显然当对象被反序列化时,它的构造函数会再次被调用,从而重置状态的变化,这不是我想要的。

基本上是这样的:

class Test
{
    public int a { get; set; }
    public Test() { a = 1; }
}

Test x = new Test();
x.a = 2;

IsolatedStorageSettings.ApplicationSettings["test"] = x;
IsolatedStorageSettings.ApplicationSettings.Save();

// on next app launch
Test x = IsolatedStorageSettings.ApplicationSettings["test"] as Test;
Debug.writeLine(x.a) // 1, I want 2

我可以以某种方式更改进程,以便在反序列化时不会调用对象的构造函数吗?

1 个答案:

答案 0 :(得分:2)

当然,反序列化器必须调用类型的构造函数,因为它需要首先创建一个类型的实例(对象),然后使用序列化输入中找到的数据填充对象的属性。

因此,一个快速的解决方法是将默认的无参数构造函数留空,并在带有参数的构造函数中执行特殊初始化,或者使用对方法的专用调用来初始化对象。

OR,使用专用类型进行序列化/反序列化,使用DTO(数据传输对象),然后从该对象中使用您需要的任何信息。


但是无论如何,在你的代码示例中,有些东西是可疑的,它应该按照你的预期工作,因为首先反序列化器会调用构造函数,并且只有在设置了属性之后,你可以通过在类构造函数中设置断点来测试它。单个属性的设置者可以查看流程工作流程。