En .NET puede seleccionar una tabla hash como tipo para un conjunto de usuarios. Sin embargo, cuando lo guardo y lo recupero de esta manera, parece que no lo ha guardado.¿Cómo almacenar una HashTable en la configuración de usuario?
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);
}
¿Por qué no lo serializa en el conjunto de usuarios, cuando puedo seleccionar claramente ese tipo en Visual Studio? Yo entendería si este fuera el caso con un tipo no listado como el diccionario, pero Hashtable aparece en la lista. ¿Cómo resuelvo este problema?
La simplicidad y la eficiencia en este orden tienen la más alta prioridad para mí.
Muchas gracias, Kave
actualización:
@Joao, Muchas Gracias la solución binaria. Lo encuentro bastante interesante, está limpio. Un inconveniente de serializarlo como binario podría ser el hecho de que ya no puede cambiar nada en el archivo de configuración de usuarios manualmente. pero creo que eso se hará muy raramente de todos modos, así que es una buena solución.
Estaba pensando en un enfoque diferente para crear un campo "de configuración de XML" de tipo cadena en el ámbito del usuario y usar este código para almacenar y recuperar los valores como un archivo XMl serializado en una tabla hash. Pero estoy seguro de que esta no es la mejor manera, ¿alguien sabe una mejor manera de serializar un hashtable/dictionary como xml en la configuración de los usuarios, aparte de lo que estoy haciendo a continuación?
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);
}
Acabo de probar persistiendo una Hashtable como configuración de usuario y no he detectado ningún problema. Si aún no lo ha hecho, trate de hacerlo desde cero en un nuevo proyecto de prueba. –
Hola, acabo de intentarlo de nuevo. Sigue mostrando las Propiedades. Configuración. La configuración predeterminada permanece nula, incluso después de haber guardado y reiniciado la aplicación. Sin embargo, funciona con otros tipos de cadena. ¿Cómo lo hiciste funcionar? ¿Puedes publicar tu solución de alguna manera? – Houman
Tenía que precipitarme en mis pruebas. La Hashtable no persiste entre las ejecuciones de la aplicación con la clase de configuración predeterminada. Sin embargo, si es vital que tenga un Hashtable y no le moleste el trabajo manual, puede verificar mi respuesta. –