3

我正在尝试将此类序列化和反序列化为 Windows Phone ApplicationSettings,但由于某种原因,仅保留Items了 or 属性,而不是TitleorLastChanged属性。任何关于为什么的想法都会受到赞赏!

班级:

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. 按“保存数据”保存到独立存储
  3. 关闭并重新运行应用程序
  4. 观看两个集合的标题消失,因为它们没有持久化
4

2 回答 2

1

我最好的猜测是,问题源于您从 ObservableCollection 继承了 VehicleCollection 类,并且序列化和反序列化中有一段代码,例如“如果对象是 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。无论如何-如果我在您的示例解决方案中以这种方式更改它,它就可以工作。

于 2013-06-10T20:15:33.793 回答
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]);
    }

无论如何,它可能会给您带来更好的性能。

于 2013-06-10T07:23:16.940 回答