具有自定义类的Windows Phone隔离存储设置将无法正确加载

时间:2013-06-01 07:53:08

标签: c# silverlight windows-phone

我一直在尝试获取隔离存储设置,以便在Windows Phone 7.5应用程序中保存一些数据。我可以成功保存和加载简单类型的整数,但由于某些原因,当我使用自己的类时,它无法正常工作。我希望能够从ISO设置中读取,操作数据,然后选择“不保存”,以便应用程序再次从ISO读取,但由于某种原因,ISO加载已被操作的数据,而不是原始保存的数据。以下是一些简单的c#代码来解释这个问题:

Order k = new Order(){ID=5}; // create order with ID of 5
IsolatedStorageSettings.ApplicationSettings.Add("mykey", k); // Save to ISO
IsolatedStorageSettings.ApplicationSettings.Save();

Order m = (Order)IsolatedStorageSettings.ApplicationSettings["myKey"]; // M = 5
m.ID = 6; // Change ID number
m = (Order)IsolatedStorageSettings.ApplicationSettings["myKey"]; // M = 6???

为什么m = 6?不应该是5,因为我从未保存更改的身份证号码?这是某种指针问题吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

IsolatedStorageSettings.ApplicationSettings正在加载数据一次 - 不是每次访问集合时 - 并将反序列化的值存储在内存中。这是有道理的,因为只有您的应用程序应该访问这些应用程序设置,它们只会在您保存它们时更改底层存储。因此,无需在每次访问时重新加载它们。

由于Order的实例通过引用传递(因为它是class

Order m = (Order)IsolatedStorageSettings.ApplicationSettings["myKey"]

可以(大致)读作:

  • 创建一个地方来存储对类Order的实例的引用,名为m
  • "myKey"类的ApplicationSettings属性所持有的当前数据中查找与字符串IsolatedStorage对应的对象的引用
  • 表示该位置的对象实际上是Order类的实例,或者引用为null(否则抛出异常)
  • m引用内存中与我们刚刚找到的Order类的实例相同的对象

这意味着可以通过检查m来观察操纵(Order)IsolatedStorageSettings.ApplicationSettings["myKey"]上的值,反之亦然。简而言之,m不仅等于应用程序设置中的值 - 应用程序设置中的值。

此处应该做的是,继续操纵m影响从设置中读回的值,提供一种机制来复制/克隆Order个对象并在副本上进行更改。如果您对更改感到满意,请将对象的副本重新放入应用程序设置中,以便不会在那里显示进一步的操作(而不是实际保存的数据)。

有一个用于指示可以复制/克隆的内容的烘焙界面,它是ICloneable

示例:

public class Order : ICloneable
{
    public int ID { get; set; }
    public object Clone()
    {
        return new Order { ID = ID };
    }
}

使用示例:

Order k = new Order(){ID=5}; // create order with ID of 5
IsolatedStorageSettings.ApplicationSettings.Add("mykey", k); // Save to ISO
IsolatedStorageSettings.ApplicationSettings.Save();

Order m = (Order)((Order)IsolatedStorageSettings.ApplicationSettings["myKey"]).Clone(); // M = 5
m.ID = 6; // Change ID number
m = (Order)((Order)IsolatedStorageSettings.ApplicationSettings["myKey"]).Clone(); // M = 5

但是,您可以按如下方式编写Order类,并避免进行第二次演员:

public class Order : ICloneable
{
    public int ID { get; set; }

    public Order Clone()
    {
        return new Order { ID = ID };
    }

    object ICloneable.Clone()
    {
        return Clone();
    }
}

像这样使用它:

Order m = ((Order)IsolatedStorageSettings.ApplicationSettings["myKey"]).Clone();