.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, 많은 감사 이진 솔루션입니다. 나는 그것을 꽤 재미 있다고 느낍니다. 바이너리로 직렬화 할 때의 단점은 더 이상 수동으로 usersetting 파일의 내용을 변경할 수 없다는 것입니다. 그러나 나는 어쨌든 아주 드물게 그렇게 될 것이라고 생각한다. 그래서 좋은 해결책이다.
사용자 범위에 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은 기본 설정 클래스를 사용하는 응용 프로그램 실행간에 유지되지 않습니다. 그러나 Hashtable을 가지고 있고 수동 작업에 신경 쓸 필요가 없다면 내 대답을 확인할 수 있습니다. –