Serialization IsolatedStorageSettings.ApplicationSettings不保留所有属性

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

我正在尝试将此类序列化并反序列化为Windows Phone应用程序设置,但由于某些原因,只有
被持久化,而不是
标题
上次更改的属性。任何关于为什么的想法都会受到赞赏

类别:

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,这似乎是罪魁祸首。仍然很奇怪,但我想我必须解决这个问题。再次感谢!