【发布时间】:2009-11-21 11:34:03
【问题描述】:
在 .NET 中,您可以选择哈希表作为用户设置的类型。但是,当我以这种方式保存并检索它时,它似乎根本没有保存它。
Hashtable t = new Hashtable();
t.Add(1,"Foo");
t.Add(2,"Bar");
Properties.Settings.Default.Setting = t;
Properties.Settings.Default.Save();
if(Properties.Settings.Default.Setting != null)
foreach (DictionaryEntry entry in Properties.Settings.Default.Setting)
{
MessageBox.Show(entry.Key + " " + entry.Value);
}
当我可以在 Visual Studio 中清楚地选择该类型时,为什么它不在用户设置中序列化它?我会理解如果这是未列出的类型(例如字典)的情况,但列出了 Hashtable。我该如何解决这个问题?
按此顺序排列的简单性和效率对我来说是最高优先级。
非常感谢, 卡夫
更新:
@Joao ,非常感谢二进制解决方案。我觉得它很有趣,很干净。将其序列化为二进制文件的一个缺点可能是您无法再手动更改用户设置文件中的任何内容。但我认为无论如何很少会这样做,所以这是一个很好的解决方案。
我正在考虑一种不同的方法来在用户范围内创建字符串类型的“XMLSetting”字段,并使用此代码将值存储和检索为序列化为哈希表的 XMl 文件。但我确信这不是最好的方法,除了我在下面做的事情之外,有没有人知道在用户设置中将哈希表/字典序列化为 xml 的更好方法?
if(string.IsNullOrEmpty(Properties.Settings.Default.XMLSetting))
{
Console.WriteLine("Usersettings is empty. Initializing XML file...");
XmlDocument doc = new XmlDocument();
XmlElement hashtable = doc.CreateElement("HashTable");
doc.AppendChild(hashtable);
GenerateValues(doc, hashtable, "1", "Foo");
GenerateValues(doc, hashtable, "2", "Bar");
Properties.Settings.Default.XMLSetting = doc.OuterXml;
Properties.Settings.Default.Save();
}
else
{
Console.WriteLine("Retrieving existing user settings...");
XmlDocument doc = new XmlDocument();
doc.LoadXml(Properties.Settings.Default.XMLSetting);
Hashtable hashtable = new Hashtable();
foreach (XmlNode entry in doc.DocumentElement.ChildNodes)
{
hashtable.Add(int.Parse(entry.FirstChild.InnerText), entry.FirstChild.NextSibling.InnerText);
}
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine(entry.Key + " " + entry.Value);
}
}
private static void GenerateValues(XmlDocument doc, XmlElement hashtable, string skey, string svalue)
{
XmlElement entry = doc.CreateElement("entry");
XmlElement key = doc.CreateElement("Key");
XmlElement value = doc.CreateElement("Value");
entry.AppendChild(key);
entry.AppendChild(value);
key.AppendChild(doc.CreateTextNode(skey));
value.AppendChild(doc.CreateTextNode(svalue));
hashtable.AppendChild(entry);
}
【问题讨论】:
-
我刚刚测试了将 Hashtable 持久化为用户设置,并没有发现任何问题。如果您还没有这样做,请尝试在新的测试项目中从头开始。
-
嗨,我刚刚又试了一次。它一直在说 Properties.Settings.Default.Setting 保持为空,即使在我保存并重新启动应用程序之后也是如此。不过,它适用于其他类型的字符串。你是怎么让它工作的?你能以某种方式发布你的解决方案吗?
-
我的测试太仓促了。 Hashtable 不会在使用默认设置类的应用程序运行之间持久化。但是,如果拥有一个 Hashtable 对您来说至关重要并且不介意一些手动工作,您可以查看我的答案。