带有自定义类的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吗?这是指针问题吗?我该怎么解决这个问题?
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();