我有一个List<class>数据.我希望保存它并在每次我的应用程序启动和退出时检索它.什么是IsolatedStorageWindows 8中的(WP7).如何保存这些设置?
在Windows 8中,您必须使用LocalFolder适用于您的应用,您可以使用以下方式访问:
StorageFolder folder = ApplicationData.Current.LocalFolder;
Run Code Online (Sandbox Code Playgroud)
然后使用以下参考文件保存在那里:
var fileToGet = await folder.GetFileAsync("nameOfFile.fileType");
Run Code Online (Sandbox Code Playgroud)
我目前处于我正在处理的项目中的类似情况,我希望将自定义对象列表存储到我的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;
}
Run Code Online (Sandbox Code Playgroud)
现在您已经拥有了该字符串,您可以将其保存为文本文件并将其放在LocalStorage中:
//assuming you already have a list with data called myList
await Windows.Storage.FileIO.WriteTextAsync("xmlFile.txt", SerializeListToXml(myList));
Run Code Online (Sandbox Code Playgroud)
现在,当您再次加载应用程序时,可以使用上面提到的加载方法从LocalStorage获取xmlFile,然后对其进行反序列化以使List返回.
string listAsXml = await Windows.Storage.FileIO.ReadTextAsync(xmlFile.txt);
List<CustomObject> deserializedList = DeserializeXmlToList(listAsXml);
Run Code Online (Sandbox Code Playgroud)
再次,根据您的需求进行调整:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用此类来存储和加载设置:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是你只能保存和加载原始类型(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);
}
}
Run Code Online (Sandbox Code Playgroud)
另请参阅是否有办法在Windows应用商店应用的ApplicationSettings中存储自己的类的实例?
| 归档时间: |
|
| 查看次数: |
4865 次 |
| 最近记录: |