.NETでは、ユーザー設定のタイプとしてハッシュテーブルを選択できます。しかし、私はそれを保存し、このように取得すると、それはまったくそれを保存していないようです。HashTableをusersettingsに保存するには?
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がリストされています。この問題をどうやって解決するのですか?
この順番で単純さと効率が私にとって最優先事項です。
多くのおかげで、 KAVE
更新:
@Joao、多くのおかげでバイナリソリューション。私はそれが非常に面白い、清潔であることがわかります。バイナリとしてそれをシリアル化することの1つの欠点は、ユーザー設定ファイル内の何も手動で変更することができないという事実かもしれません。しかし、私はそれがとにかくまれにしか行われないだろうと思うので、良い解決策です。
私は、ユーザースコープにstring型の "XMLSetting"フィールドを作成し、このコードを使用してハッシュテーブルにシリアル化されたXMlファイルとして値を格納および取得する方法を考えていました。しかし、私はこれが最善の方法ではないと確信しています、誰かが私が下でやっている以外の、usersettingsの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は、アプリケーションを保存して再起動した後でも、nullのままとしています。それは他のタイプの文字列でも動作します。どうやってそれを稼働させましたか?何とかあなたのソリューションを投稿できますか? – Houman
私はテストで急いでいました。ハッシュテーブルは、デフォルトの設定クラスでのアプリケーション実行の間に保持されません。しかし、あなたがHashtableを持っていて手作業を気にしなければ、私の答えをチェックすることができます。 –