2012-10-07 14 views

Odpowiedz

8

w systemie Windows 8, trzeba użyć LocalFolder dla aplikacji, które można uzyskać dostęp przy użyciu:

StorageFolder folder = ApplicationData.Current.LocalFolder; 

a następnie odwołać pliki zapisane tam za pomocą:

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

Jestem obecnie w podobnej sytuacji w projekcie, nad którym pracuję, w którym chcę przechowywać listę niestandardowych obiektów do mojego LocalFolder Apps i mieć go ponownie załadowane później.

Moje rozwiązanie polegało na serializacji listy do łańcucha XML i zapisaniu jej w folderze aplikacji. Powinieneś być w stanie dostosować swoje metody:

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; 
     } 

Teraz, że masz ciąg można zapisać go do pliku tekstowego i umieścić to w localStorage:

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

Teraz, kiedy załadować aplikację znowu może użyć metody ładowania wymienionej powyżej, aby pobrać plik xmlFile z LocalStorage, a następnie przekształcić go w postać deserializacyjną, aby odzyskać swoją listę.

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

Ponownie dostosować do Twoich potrzeb:

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; 
     } 
    } 
5

Można użyć tej klasy do przechowywania i ustawienia obciążenie:

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; 
    } 
} 

Ale można tylko zapisać i załadować prymitywnych typów (bool, int, string itp.). To dlatego musisz serializować swoją listę do formatu XML lub innego formatu, który może być przechowywany w łańcuchu. Do serializacji i deserializacji obiektu do iz XML można użyć następujących metod:

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); 
    } 
} 

Zobacz również Is there a way to store instances of own classes in the ApplicationSettings of a Windows Store app?

Powiązane problemy