在Windows窗体和WPF桌面应用中,您可以使用Properties.Settings.Default.MyAwesomeDictionarySetting = thisDictionaryObject;
将类型Dictionary
的设置保存到应用程序设置中。但是,大多数此类设置的优势似乎都不存在于Windows 8 metro应用程序中。
目前,当我将字符串保存到设置时,我会这样做:
localSettings.Values["someSetting"] = "dude";
但是,这还不够好。我也需要保存对象。我需要在某处保存Dictionary
某些设置。
请注意,这不适用于“设置”超级按钮,这更像是仅限应用的内部设置。
我们如何将Dictionary<Object, String>
保存到设置?
答案 0 :(得分:0)
你没错,LocalSettings / RoamingSettings只支持these data types。我怀疑,其中一个原因是WPF / etc中使用的非平凡类型的序列化非常冗长(如果我错了,请纠正我)。这会对保存和读取持久存储的隐含速度产生负面影响。事实上,有一点需要注意的是,从LocalSettings和RoamingSettings读取/写入不是 async
调用,这意味着这些操作意味着超级快速。
解决问题的一个相对简单的方法是为设置数据类实现二进制序列化,并将二进制数据转换为base64字符串。由于System.Convert.ToBase64String(byte[])
和System.Convert.FromBase64String(string)
,这一点特别方便。例如,您可以使用以下内容:
private string ConvertToBase64String<T>(T obj) where T : class, IBinarySerializable
{
if (obj == null)
return string.Empty;
using (var stream = new System.IO.MemoryStream())
using (var writer = new System.IO.BinaryWriter(stream))
{
obj.Write(writer);
var bytes = stream.ToArray();
return System.Convert.ToBase64String(bytes);
}
}
和
private T ConvertFromBase64String<T>(string string64) where T : IBinarySerializable, new()
{
if (string.IsNullOrEmpty(string64))
return default(T);
var bytes = System.Convert.FromBase64String(string64);
using (var stream = new System.IO.MemoryStream(bytes))
using (var reader = new System.IO.BinaryReader(stream))
{
var obj = new T();
obj.Read(reader);
return obj;
}
}
使用二进制序列化的优势在于它比基于反射的序列化快得多,快得多(根据我的经验,速度快了一个数量级)。