【问题标题】:What attribute do I need to save to RoamingSettings?我需要将什么属性保存到 RoamingSettings?
【发布时间】:2023-04-03 07:28:01
【问题描述】:

我需要将什么属性保存到 RoamingSettings?

就像我序列化数据时一样,它需要DataContractDataMember 属性。我可以将我的类序列化为 XML,但我需要使用 RoamingSettings 保存它:

roamingSettings.Values["MyType"] = _mytype;

在调试时,我收到以下错误消息:

不支持这种类型的数据。
WinRT 信息:尝试序列化要写入应用程序数据存储的值时出错

我想我需要一个属性,但是哪个?

【问题讨论】:

    标签: c# windows-8 roaming


    【解决方案1】:

    使用正确的 StorageFolder ApplicationData.Current.RoamingFolder

    public static class RoamingStorage<T> {
    
        public static async void SaveData(string filename, T data)
        {
            try
            {
                StorageFile file = await ApplicationData.Current.RoamingFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
                using (IRandomAccessStream raStream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    using (IOutputStream outStream = raStream.GetOutputStreamAt(0))
                    {
                        DataContractSerializer serializer = new DataContractSerializer(typeof(List<Item>));
                        serializer.WriteObject(outStream.AsStreamForWrite(), data);
                        await outStream.FlushAsync();
                    }
                }
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }
    
        public static async System.Threading.Tasks.Task<T> LoadData(string filename)
        {
            T data = default(T);
            try
            {
                StorageFile file = await ApplicationData.Current.RoamingFolder.GetFileAsync(filename);
                using (IInputStream inStream = await file.OpenSequentialReadAsync())
                {
                   DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                   data = (T)serializer.ReadObject(inStream.AsStreamForRead());
                }
            }
            catch (FileNotFoundException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return data;
        }
    }
    

    示例调用

    RoamingStorage<List<Item>>.SaveData(FILENAME,Items);
    
    List<Item> data = await RoamingStorage<List<Item>>.LoadData(FILENAME);
    

    【讨论】:

      【解决方案2】:

      处理这种情况最好的办法,就是将对象序列化成字符串并存储起来。

      将存储的字符串值反序列化为目标对象。

      【讨论】:

      • 是的,谢谢!但是我找不到任何异步方式可以做到这一点:/
      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 2016-03-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      相关资源
      最近更新 更多