没错,LocalSettings/RoamingSettings 只支持这些数据类型。我怀疑,一个原因是 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;
}
}
使用二进制序列化的优点是速度快,比基于反射的序列化快得多(根据我的经验,大约快一个数量级)。