【问题标题】:How to save ObservableCollection in Windows Store App?如何在 Windows Store App 中保存 ObservableCollection?
【发布时间】:2012-12-17 22:52:51
【问题描述】:

我正在基于拆分应用模板创建 Windows 应用商店应用。从 SampleDataSource 保存数据以供以后使用的最佳方法是什么?

我试过了:

Windows.Storage.ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
roamingSettings.Values["Data"] = AllGroups;

它抛出异常:'不支持这种类型的数据'。

【问题讨论】:

    标签: c# windows windows-8 windows-runtime


    【解决方案1】:

    RoamingSettings 仅支持runtime data types(Uri 除外);此外,每个设置和总共可以保存多少数据是有限制的。

    在存储方面最好使用RoamingFolder(或者LocalFolder)。

    对于序列化方面,您可以尝试DataContractSerializer。如果你有这样的课程:

    public class MyData
    {
        public int Prop1 { get; set; }
        public int Prop2 { get; set; }
    }
    public ObservableCollection<MyData> coll;
    

    然后写如下

    var f = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("data.txt");
    using ( var st = await f.OpenStreamForWriteAsync())
    {
        var s = new DataContractSerializer(typeof(ObservableCollection<MyData>), 
                                           new Type[] { typeof(MyData) });
        s.WriteObject(st, coll);
    

    然后像这样阅读

    using (var st = await Windows.Storage.ApplicationData.Current.LocalFolder.OpenStreamForReadAsync("data.txt"))
    {
        var t = new DataContractSerializer(typeof(ObservableCollection<MyData>), 
                                           new Type[] { typeof(MyData) });
        var col2 = t.ReadObject(st) as ObservableCollection<MyData>;
    
    }
    

    【讨论】:

    • 在写入期间我收到以下错误:“类型'MyData'无法序列化。考虑使用 DataContractAttribute 属性标记它,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果类型是集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。有关其他支持的类型,请参阅 Microsoft .NET Framework 文档。"
    • 使用您自己的“MyData”版本?上面的代码应该可以正常工作,并且对我有用。您的 MyData 是什么样的?
    • 这是我自己的。它基于默认的 SplitApp 模板:jj09.snipt.net/my-collection-for-save-in-win8 (MyData=GtdDataGroup)
    • 好的,你的场景肯定更复杂,有集合成员和私有字段。关于使用属性标记属性的建议是合理的。您可能会在序列化方面遇到一些循环问题(请参阅 IsReference),但通过一些调整,我可以让您的类结构至少在快速测试中序列化。开始用属性装饰你的类,你会成功的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多