Serialization IsolatedStorageSettings.ApplicationSettings不保留所有属性
我正在尝试将此类序列化并反序列化为Windows Phone应用程序设置,但由于某些原因,只有Serialization IsolatedStorageSettings.ApplicationSettings不保留所有属性,serialization,windows-phone,isolatedstorage,Serialization,Windows Phone,Isolatedstorage,我正在尝试将此类序列化并反序列化为Windows Phone应用程序设置,但由于某些原因,只有项被持久化,而不是标题或上次更改的属性。任何关于为什么的想法都会受到赞赏 类别: public class VehicleCollection : ObservableCollection<Vehicle> { public string Title { get; set; } public DateTime LastChanged { get; set; } pu
项
被持久化,而不是标题
或上次更改的属性。任何关于为什么的想法都会受到赞赏
类别:
public class VehicleCollection : ObservableCollection<Vehicle>
{
public string Title { get; set; }
public DateTime LastChanged { get; set; }
public bool HasNoItems { get { return Items.Count == 0; } }
public VehicleCollection() { }
public VehicleCollection(string title, DateTime lastChanged)
{
Title = title;
LastChanged = lastChanged;
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
base.OnCollectionChanged(e);
OnPropertyChanged(new PropertyChangedEventArgs("HasNoItems"));
}
}
公共类车辆采集:可观测采集
{
公共字符串标题{get;set;}
公共日期时间LastChanged{get;set;}
public bool HasNoItems{get{return Items.Count==0;}
公共车辆收集(){}
公共车辆集合(字符串标题,日期时间上次更改)
{
头衔=头衔;
LastChanged=LastChanged;
}
CollectionChanged上的受保护覆盖无效(NotifyCollectionChangedEventArgs e)
{
基础。变更的集合(e);
OnPropertyChanged(新PropertyChangedEventArgs(“HasNoItems”);
}
}
持久化逻辑:
public static bool SavePersistent(string key, object value)
{
if (null == value)
return false;
var store = IsolatedStorageSettings.ApplicationSettings;
if (store.Contains(key))
store[key] = value;
else
store.Add(key, value);
store.Save();
return true;
}
public static T LoadPersistent<T>(string key)
{
var store = IsolatedStorageSettings.ApplicationSettings;
if (!store.Contains(key))
return default(T);
return (T)store[key];
}
公共静态bool SavePersistent(字符串键、对象值)
{
if(null==值)
返回false;
变量存储=隔离存储设置。应用程序设置;
if(store.Contains(key))
存储[键]=值;
其他的
存储。添加(键、值);
store.Save();
返回true;
}
公共静态T LoadPersistent(字符串键)
{
变量存储=隔离存储设置。应用程序设置;
如果(!store.Contains(key))
返回默认值(T);
返回(T)存储[键];
}
编辑:我创建了一个示例项目,其中行为是明显的
运行应用程序并查看正在创建的静态数据
按“保存数据”保存到隔离存储
关闭并重新运行应用程序
看着这两个集合的标题消失,因为它们没有被持久化
[这不是对您问题的直接回答,而是一个解决方案。]
很可能您已经在使用JSON.NET或类似的东西。使用它将对象序列化为字符串,然后保存字符串怎么样
使用JSON.NET,这会将您的代码更改为:
public static bool SavePersistent(string key, object value)
{
if (null == value)
return false;
value = JsonConvert.SerializeObject(value);
var store = IsolatedStorageSettings.ApplicationSettings;
if (store.Contains(key))
store[key] = value;
else
store.Add(key, value);
store.Save();
return true;
}
public static T LoadPersistent<T>(string key)
{
var store = IsolatedStorageSettings.ApplicationSettings;
if (!store.Contains(key))
return default(T);
return JsonConvert.DeserializeObject<T>((string)store[key]);
}
公共静态bool SavePersistent(字符串键、对象值)
{
if(null==值)
返回false;
value=JsonConvert.SerializeObject(值);
变量存储=隔离存储设置。应用程序设置;
if(store.Contains(key))
存储[键]=值;
其他的
存储。添加(键、值);
store.Save();
返回true;
}
公共静态T LoadPersistent(字符串键)
{
变量存储=隔离存储设置。应用程序设置;
如果(!store.Contains(key))
返回默认值(T);
返回JsonConvert.DeserializeObject((字符串)store[key]);
}
无论如何,它可能会给您带来更好的性能。我最好的猜测是,问题是您从ObservaleCollection继承了VehicleCollection类,并且序列化和反序列化中有一段代码,如“if object is ObservaleCollection”。我尝试了您的示例解决方案,成员的getter在序列化时不被调用,setter在反序列化时也不被调用
解决方案是重构VehicleCollection类,如下所示:
public class VehicleCollection
{
public string Title { get; set; }
public DateTime LastChanged { get; set; }
public bool HasNoItems { get { return Items.Count == 0; } }
public VehicleCollection()
{
Items = new ObservableCollection<Vehicle>()
}
public VehicleCollection(string title, DateTime lastChanged) :this()
{
Title = title;
LastChanged = lastChanged;
}
public ObservableCollection<Vehicle> Items
}
公共类车辆收集
{
公共字符串标题{get;set;}
公共日期时间LastChanged{get;set;}
public bool HasNoItems{get{return Items.Count==0;}
公共车辆收费
{
Items=新的ObservableCollection()
}
公共车辆集合(字符串标题,DateTime lastChanged):this()
{
头衔=头衔;
LastChanged=LastChanged;
}
公共可观测收集项目
}
当然,不好的是,VehicleCollection需要实现INotitifyPropertyChanged以启动Hasnoitem。无论如何,如果我在你的示例解决方案中以这种方式更改它,它会起作用 谢谢你的建议,试过了,但不知怎么的,它给了我同样的结果。虽然这听起来很奇怪,但这种行为是故意的。请看这个问题:它是关于XmlSerializer
的,但它也适用于DataContractSerializer
(它在内部由IsolatedStorageSettings
使用)感谢KooKiz,这似乎是罪魁祸首。仍然很奇怪,但我想我必须解决这个问题。再次感谢!