2012-10-07 8 views

Respuesta

8

en Windows 8, usted tiene que utilizar el LocalFolder para su aplicación, que se puede acceder usando:

StorageFolder folder = ApplicationData.Current.LocalFolder; 

y después hacer referencia a archivos guardados allí mediante el uso de:

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

estoy actualmente en una situación similar en un proyecto en el que estoy trabajando, donde quiero almacenar una Lista de objetos personalizados en mi carpeta Local de aplicaciones y hacer que se vuelva a cargar más tarde.

Mi solución fue serializar la lista en una cadena XML y almacenarla en la carpeta de la aplicación. Usted debe ser capaz de adaptar mis métodos:

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

Ahora que tiene la cadena se puede guardar un archivo de texto y poner esto en LocalStorage:

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

Ahora cuando se carga la aplicación de nuevo puede usar el método de carga mencionado anteriormente para obtener el archivo xml de LocalStorage y luego deserializarlo para recuperar su lista.

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

Una vez más, adaptar esto a sus necesidades:

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

Se puede utilizar esta clase para almacenar y cargar ajustes:

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

Pero sólo se puede guardar y cargar los tipos primitivos (bool, int, cadena, etc.). Es por eso que debe serializar su lista a XML u otro formato que pueda almacenarse en una cadena. Para serializar y deserializar un objeto hacia y desde XML que puede utilizar estos métodos:

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

Ver también Is there a way to store instances of own classes in the ApplicationSettings of a Windows Store app?

Cuestiones relacionadas