我正在尝试将此类序列化和反序列化为Windows Phone ApplicationSettings,但由于某些原因,只保留Items
而不是Title
或LastChanged
属性。关于为什么被赞赏的任何想法!
类别:
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"));
}
}
坚持逻辑:
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];
}
<小时/> 编辑:我已经创建了一个行为明显的示例项目。 http://www.fileswap.com/dl/2ar0ygF8w7/
答案 0 :(得分:1)
我最好的猜测是问题来自于你从ObservableCollection继承了你的VehicleCollection类,并且序列化和反序列化在它们中有一段代码,如'if object is ObservableCollection'。我已经尝试过你的示例解决方案,并且不会在序列化时调用成员的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
}
当然,糟糕的是,然后VehicleCollection需要实现INotitifyPropertyChanged以触发HasNoItems。无论如何 - 如果我在你的样本解决方案中以这种方式改变它,它就可以了
答案 1 :(得分:0)
[这不是您问题的直接答案,而是一种解决方案。]
您可能已经在使用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]);
}
无论如何它可能会给你更好的表现。