IsolatedStorageSettings.ApplicationSettings不会保留所有属性

时间:2013-06-09 20:27:04

标签: serialization windows-phone isolatedstorage

我正在尝试将此类序列化和反序列化为Windows Phone ApplicationSettings,但由于某些原因,只保留Items而不是TitleLastChanged属性。关于为什么被赞赏的任何想法!

类别:

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/

  1. 运行应用并观看正在创建的静态数据
  2. 按“保存数据”以保存到IsolatedStorage
  3. 关闭并重新运行应用
  4. 观看两个馆藏的标题消失,因为它们没有被保留

2 个答案:

答案 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]);
    }

无论如何它可能会给你更好的表现。