【问题标题】:What is the best way of saving List<Object> in Windows 8 app在 Windows 8 应用程序中保存 List<Object> 的最佳方法是什么
【发布时间】:2015-02-23 16:43:13
【问题描述】:

我有一个List&lt;class&gt; 的数据。我想保存它并在我的应用程序每次启动和退出时分别检索它。 Windows 8 中 IsolatedStorage (WP7) 的等效项是什么。如何保存这些设置?

【问题讨论】:

    标签: windows-8


    【解决方案1】:

    在 Windows 8 中,您必须为您的应用使用 LocalFolder,您可以使用以下方式访问:

    StorageFolder folder = ApplicationData.Current.LocalFolder;
    

    然后使用以下方法引用保存在那里的文件:

    var fileToGet = await folder.GetFileAsync("nameOfFile.fileType");
    

    我目前在我正在处理的项目中处于类似情况,我想将自定义对象列表存储到我的 Apps LocalFolder 并稍后重新加载。

    我的解决方案是将列表序列化为 XML 字符串,并将其存储在 App 文件夹中。你应该能够适应我的方法:

    static public string SerializeListToXml(List<CustomObject> List)
        {
            try
            {
                XmlSerializer xmlIzer = new XmlSerializer(typeof(List<CustomObject>));
                var writer = new StringWriter();
                xmlIzer.Serialize(writer, List);
                System.Diagnostics.Debug.WriteLine(writer.ToString());
                return writer.ToString();
            }
    
            catch (Exception exc)
            {
                System.Diagnostics.Debug.WriteLine(exc);
                return String.Empty;
            }
    

    现在您有了字符串,您可以将其保存为文本文件并将其放入 LocalStorage:

    //assuming you already have a list with data called myList
    await Windows.Storage.FileIO.WriteTextAsync("xmlFile.txt", SerializeListToXml(myList));
    

    现在当你再次加载你的应用程序时,你可以使用上面提到的加载方法从 LocalStorage 中获取 xmlFile,然后将其反序列化以获取你的 List。

    string listAsXml = await Windows.Storage.FileIO.ReadTextAsync(xmlFile.txt);
    List<CustomObject> deserializedList = DeserializeXmlToList(listAsXml);
    

    再次,根据您的需要调整它:

    public static List<CustomObject> DeserializeXmlToList(string listAsXml)
        {
            try
            {
                XmlSerializer xmlIzer = new XmlSerializer(typeof(List<CustomObject>));
                XmlReader xmlRead = XmlReader.Create(listAsXml);
                List<CustomObject> myList = new List<CustomObject>();
                myList = (xmlIzer.Deserialize(xmlRead)) as List<CustomObject>;
                return myList;
            }
    
            catch (Exception exc)
            {
                System.Diagnostics.Debug.WriteLine(exc);
                List<CustomObject> emptyList = new List<CustomObject>();
                return emptyList;
            }
        }
    

    【讨论】:

      【解决方案2】:

      你可以使用这个类来存储和加载设置:

      public static class ApplicationSettings
      {
          public static void SetSetting<T>(string key, T value, bool roaming = true)
          {
              var settings = roaming ? ApplicationData.Current.RoamingSettings : ApplicationData.Current.LocalSettings;
              settings.Values[key] = value;
          }
      
          public static T GetSetting<T>(string key, bool roaming = true)
          {
              return GetSetting(key, default(T), roaming);
          }
      
          public static T GetSetting<T>(string key, T defaultValue, bool roaming = true)
          {
              var settings = roaming ? ApplicationData.Current.RoamingSettings : ApplicationData.Current.LocalSettings;
              return settings.Values.ContainsKey(key) &&
                     settings.Values[key] is T ?
                     (T)settings.Values[key] : defaultValue;
          }
      
          public static bool HasSetting<T>(string key, bool roaming = true)
          {
              var settings = roaming ? ApplicationData.Current.RoamingSettings : ApplicationData.Current.LocalSettings;
              return settings.Values.ContainsKey(key) && settings.Values[key] is T;
          }
      
          public static bool RemoveSetting(string key, bool roaming = true)
          {
              var settings = roaming ? ApplicationData.Current.RoamingSettings : ApplicationData.Current.LocalSettings;
              if (settings.Values.ContainsKey(key))
                  return settings.Values.Remove(key);
              return false;
          }
      }
      

      但您只能保存和加载原始类型(bool、int、string 等)。这就是为什么您必须将您的列表序列化为 XML 或其他可以存储在字符串中的格式。要在 XML 中序列化和反序列化对象,您可以使用以下方法:

      public static string Serialize(object obj)
      {
          using (var sw = new StringWriter()) 
          {
              var serializer = new XmlSerializer(obj.GetType());
              serializer.Serialize(sw, obj);
              return sw.ToString();
          }
      }
      
      public static T Deserialize<T>(string xml)
      {
          using (var sw = new StringReader(xml))
          {
              var serializer = new XmlSerializer(typeof(T));
              return (T)serializer.Deserialize(sw);
          }
      }
      

      另见Is there a way to store instances of own classes in the ApplicationSettings of a Windows Store app?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 2019-07-28
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        相关资源
        最近更新 更多