我创建了一个类型为“System.Collections.Specialized.StringDictionary”的用户范围设置。每当我打开本地设置时,我都可以在配置中看到它,但它是空的。
我有其他正确保存的用户设置,但这个字典似乎根本没有保存。
为了保存字典,我需要做些什么吗?
答案 0 :(得分:11)
问题是Dictionary
没有序列化为XML(即使它真的应该)。你有两个选择。您可以为字典指定自己的序列化方法,也可以作弊。
如果您不关心能够读取/编辑XML中的值,则可以为该设置添加[SettingSerializeAs(SettingsSerializeAs.Binary)]
属性。完成工作,但这是快速而肮脏的方法。
答案 1 :(得分:5)
我不知道在设置中使用StringDictionary
时遇到的任何具体问题或解决方法,但可能会解决问题,只使用字符串?你可以将数据序列化为xml,或者(或许更简单)只是一个键/值分隔的字符串?请注意DbConnectionStringBuilder
提供了一种简单的方法(如下所示)。
标记化的字符串是“abc = def; ghi = jkl”,但它会自动处理转义规则等更复杂的数据。值得一试?
using System;
using System.Collections.Specialized;
using System.Data.Common;
public static class Program
{
static void Main()
{
StringDictionary lookup = new StringDictionary();
lookup.Add("abc", "def");
lookup.Add("ghi", "jkl");
string foo = Serialize(lookup);
Console.WriteLine(foo);
StringDictionary bar = Deserialize(foo);
foreach (string key in bar.Keys)
{
Console.WriteLine("{0}={1}", key, bar[key]);
}
}
public static string Serialize(StringDictionary data)
{
if(data == null) return null; // GIGO
DbConnectionStringBuilder db = new DbConnectionStringBuilder();
foreach (string key in data.Keys)
{
db[key] = data[key];
}
return db.ConnectionString;
}
public static StringDictionary Deserialize(string data)
{
if (data == null) return null; // GIGO
DbConnectionStringBuilder db = new DbConnectionStringBuilder();
StringDictionary lookup = new StringDictionary();
db.ConnectionString = data;
foreach (string key in db.Keys)
{
lookup[key] = Convert.ToString(db[key]);
}
return lookup;
}
}
答案 2 :(得分:3)
未保存字典,因为没有工具XmlSerializable。 我不确定,但在我看来。