我一直在尝试获取隔离存储设置,以便在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,因为我从未保存更改的身份证号码?这是某种指针问题吗?我该如何解决这个问题?
答案 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();