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

本文关键字:对象 调用 构造函数 IsolatedStorage 反序列化 | 更新日期: 2023-09-27 17:50:30

在我的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

我可以改变进程,使对象的构造函数在反序列化时不会被调用吗?

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

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

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

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


但无论如何,有些东西是可疑的,在你的代码样本中,它应该像你期望的那样工作,因为首先反序列化器会调用构造函数,然后才设置属性,你可以通过在类构造函数和单个属性的setter中设置断点来测试这一点,以查看过程工作流