带有自定义类的Windows Phone独立存储设置赢得';t正确加载

本文关键字:加载 设置 自定义 Windows 存储 独立 Phone | 更新日期: 2023-09-27 18:16:17

我一直在尝试获取"独立存储设置",以便在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吗?这是指针问题吗?我该怎么解决这个问题?

带有自定义类的Windows Phone独立存储设置赢得';t正确加载

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

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

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

可以(大致(读作:

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

这意味着通过检查(Order)IsolatedStorageSettings.ApplicationSettings["myKey"]可以观察到m上的操纵值,反之亦然。简而言之,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();