C# 如何在roaming-C中保存字典变量#

C# 如何在roaming-C中保存字典变量#,c#,dictionary,windows-store-apps,windows-8.1,roaming,C#,Dictionary,Windows Store Apps,Windows 8.1,Roaming,在学习了Visual C#手册之后,我开始为Windows 8编写一个简单的应用程序。我正在使用Visual Studio 2013 Express和.NET Framework 4.5.1。在我迄今为止编写的代码中,我在页面的代码后面创建了一个人员列表: private Dictionary<string, People> listPeople = new Dictionary<string, People>(); private Dictionary listPeo

在学习了Visual C#手册之后,我开始为Windows 8编写一个简单的应用程序。我正在使用Visual Studio 2013 Express和.NET Framework 4.5.1。在我迄今为止编写的代码中,我在页面的代码后面创建了一个人员列表:

private Dictionary<string, People> listPeople = new Dictionary<string, People>();
private Dictionary listPeople=new Dictionary();
在此之后,我希望这个列表将填充另一个页面的
组合框。我认为解决方案是在漫游中保存
Dictionary
变量,然后在需要的地方使用它。这样还可以解决即使在应用程序终止时也要维护保存的人员列表的问题


我该怎么办?

你已经那样试过了吗

var applicationData = Windows.Storage.ApplicationData.Current;
applicationData.RoamingSettings.Values["PeopleList"] = listPeople;

var applicationData = Windows.Storage.ApplicationData.Current;
var listPeople = (Dictionary<string, People>)applicationData.RoamingSettings.Values["PeopleList"];
var applicationData=Windows.Storage.applicationData.Current;
applicationData.RoamingSettings.Values[“PeopleList”]=listPeople;
var applicationData=Windows.Storage.applicationData.Current;
var listPeople=(字典)applicationData.RoamingSettings.Values[“PeopleList”];

压倒性的建议是将设置序列化为字符串,然后在
值中设置值(或将值单独保存在复杂类型中)

但是,我认为这实际上忽略了一个事实,即值是一系列键值对。。。如果您想支持复杂类型,我认为在漫游文件夹中创建您自己的文件是一个更好的主意。我已经编写了一个小助手类,通过JSON序列化来实现这一点:

public class ApplicationStorageHelper
{
    private static readonly JsonSerializer jsonSerializer = JsonSerializer.Create();

    public static async Task<bool> SaveData<T>(T data)
    {
        var file =
            await ApplicationData.Current.RoamingFolder.CreateFileAsync("settings.dat", CreationCollisionOption.ReplaceExisting);
        using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
        {
            using (var outputStream = stream.GetOutputStreamAt(0))
            {
                using (var writer = new StreamWriter(outputStream.AsStreamForWrite()))
                {
                    var jsonWriter = new JsonTextWriter(writer);
                    jsonSerializer.Serialize(jsonWriter, data);
                    return true;
                }
            }
        }
    }

    public static async Task<T> LoadData<T>()
    {
        try
        {

            var file =
                await ApplicationData.Current.RoamingFolder.GetFileAsync("settings.dat");
            using (var inputStream = await file.OpenSequentialReadAsync())
            {
                using (var reader = new StreamReader(inputStream.AsStreamForRead()))
                {
                    var jsonReader = new JsonTextReader(reader);
                    return jsonSerializer.Deserialize<T>(jsonReader);
                }
            }
        }
        catch (FileNotFoundException)
        {
            return default(T);
        }
    }
}
公共类应用程序存储帮助器
{
私有静态只读JsonSerializer JsonSerializer=JsonSerializer.Create();
公共静态异步任务SaveData(T data)
{
变量文件=
等待ApplicationData.Current.RoamingFolder.CreateFileAsync(“settings.dat”,CreationCollisionOption.ReplaceExisting);
使用(var stream=await file.OpenAsync(FileAccessMode.ReadWrite))
{
使用(var outputStream=stream.getoutputstreeamat(0))
{
使用(var writer=newstreamwriter(outputStream.AsStreamForWrite()))
{
var jsonWriter=新的JsonTextWriter(writer);
序列化(jsonWriter,数据);
返回true;
}
}
}
}
公共静态异步任务LoadData()
{
尝试
{
变量文件=
等待ApplicationData.Current.RoamingFolder.GetFileAsync(“settings.dat”);
使用(var inputStream=await file.OpenSequentialReadAsync())
{
使用(var reader=newstreamreader(inputStream.AsStreamForRead()))
{
var jsonReader=新的JsonTextReader(读取器);
返回jsonSerializer.Deserialize(jsonReader);
}
}
}
捕获(FileNotFoundException)
{
返回默认值(T);
}
}
}

您必须从Nuget或其他方式引用JSON.Net。

我没有使用win 8.1应用程序的经验,但我认为,要在应用程序终止时保持列表可用,您需要在物理文件(例如XML)中序列化它。
字典
不是
列表
。小心那区别!请定义漫游。什么文档引用了这个动作?@StefanoBafaro我怎么能这么做?@Gusdor好的,对不起。我知道
List
Dictionary
不是一回事。“漫游”指的是Windows.Storage.ApplicationData.Current.RoamingSettings。我想做一些非常类似于步骤2中所示的事情(参见第6点)。我可以用
字典
做类似的事情吗?@Marco87您必须使用XmlSerializer。在数据集合中循环,使用Xml属性调整它,然后保存它。看看这篇他们解释的帖子:彼得,非常感谢!但是当前上下文中不存在
ApplicationData、
FileAccessMode
。您编写的代码中缺少某些内容?另外,一旦编写了这个类,如何使用它来保存
listPeople
漫游?好的,我发现没有指令:
使用Newtonsoft.Json
但是,现在,如何保存
listPeople
?如何恢复已保存的
列表人员
?谢谢。请致电SaveData以保存数据,致电LoadData以加载数据。