Windows 8 保存列表的最佳方式是什么<;对象>;在Windows8应用程序中

Windows 8 保存列表的最佳方式是什么<;对象>;在Windows8应用程序中,windows-8,Windows 8,我有一个数据列表。我想在每次我的应用程序启动和退出时分别保存和检索它。在Windows 8中,与隔离存储(WP7)的等价物是什么。如何保存这些设置?在windows 8中,您必须为您的应用程序使用本地文件夹,您可以通过以下方式访问该文件夹: StorageFolder folder = ApplicationData.Current.LocalFolder; 然后使用以下方法引用保存在其中的文件: var fileToGet = await folder.GetFileAsync("nameO

我有一个
数据列表。我想在每次我的应用程序启动和退出时分别保存和检索它。在Windows 8中,与隔离存储(WP7)的等价物是什么。如何保存这些设置?

在windows 8中,您必须为您的应用程序使用
本地文件夹
,您可以通过以下方式访问该文件夹:

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获取xmlFile,然后将其反序列化以返回列表

string listAsXml = await Windows.Storage.FileIO.ReadTextAsync(xmlFile.txt);
List<CustomObject> deserializedList = DeserializeXmlToList(listAsXml);
string listAsXml=wait Windows.Storage.FileIO.ReadTextAsync(xmlFile.txt);
List 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;
        }
    }
publicstaticlist反序列化xmltolist(stringlistasxml)
{
尝试
{
XmlSerializer xmlIzer=新的XmlSerializer(类型(列表));
XmlReader xmlRead=XmlReader.Create(listAsXml);
List myList=新列表();
myList=(xmlIzer.Deserialize(xmlRead))作为列表;
返回myList;
}
捕获(异常exc)
{
系统诊断调试写线(exc);
List emptyList=新列表();
返回空列表;
}
}

您可以使用此类存储和加载设置:

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;
    }
}
公共静态类应用程序设置
{
公共静态无效设置(字符串键,T值,布尔漫游=true)
{
var设置=漫游?ApplicationData.Current.RoamingSettings:ApplicationData.Current.LocalSettings;
设置。值[键]=值;
}
公共静态T GetSetting(字符串键,bool roaming=true)
{
返回GetSetting(键,默认值(T),漫游);
}
公共静态T GetSetting(字符串键,T defaultValue,bool roaming=true)
{
var设置=漫游?ApplicationData.Current.RoamingSettings:ApplicationData.Current.LocalSettings;
返回设置.Values.ContainsKey(键)&&
设置。值[键]是否为T?
(T) 设置.值[键]:默认值;
}
公共静态bool hasseting(字符串键,bool roaming=true)
{
var设置=漫游?ApplicationData.Current.RoamingSettings:ApplicationData.Current.LocalSettings;
返回settings.Values.ContainsKey(key)和&settings.Values[key]为T;
}
公共静态bool removeseting(字符串键,bool roaming=true)
{
var设置=漫游?ApplicationData.Current.RoamingSettings:ApplicationData.Current.LocalSettings;
if(设置.值.容器(键))
返回设置。值。删除(键);
返回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);
    }
}
公共静态字符串序列化(对象obj)
{
使用(var sw=new StringWriter())
{
var serializer=新的XmlSerializer(obj.GetType());
序列化器。序列化(sw、obj);
返回sw.ToString();
}
}
公共静态T反序列化(字符串xml)
{
使用(var sw=新的StringReader(xml))
{
var serializer=newxmlserializer(typeof(T));
返回(T)序列化程序。反序列化(sw);
}
}
另见

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