In .NET è possibile selezionare una tabella come tipo per un utente. Tuttavia, quando lo salvo e lo recupero in questo modo, non sembra averlo salvato affatto.Come memorizzare un HashTable nelle impostazioni utente?
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);
}
Perché non lo serializza nelle impostazioni utente, quando posso selezionare chiaramente quel tipo in Visual Studio? Capirei se questo fosse il caso con un tipo non elencato come il dizionario, ma Hashtable è elencato. Come risolvo questo problema?
La semplicità e l'efficienza in questo ordine hanno per me la massima priorità.
Molte grazie, Kave
aggiornamento:
@Joao, molte grazie la soluzione binaria. Lo trovo piuttosto interessante, è pulito. Uno svantaggio con serializzazione come binario potrebbe essere il fatto che non si può più modificare nulla nel file di utenti manualmente. ma penso che sarà fatto molto raramente, quindi è una buona soluzione.
Stavo pensando ad un diverso approccio per creare un campo "XMLSetting" di tipo stringa nello scope utente e utilizzare questo codice per archiviare e recuperare i valori come un file XMl serializzato in una tabella hash. Ma sono sicuro che questo non è il modo migliore, qualcuno sa un modo migliore per serializzare un hashtable/dizionario come xml nelle impostazioni degli utenti, diverso da quello che sto facendo qui sotto?
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);
}
Ho appena testato la permanenza di un Hashtable come impostazione utente e non ho rilevato alcun problema. Se non lo hai già fatto, prova a farlo da zero in un nuovo progetto di test. –
Ciao, ho appena provato di nuovo. Continua a specificare Properties.Settings.Default.Setting rimane nullo, anche dopo aver salvato e riavviato l'applicazione. Funziona comunque con altri tipi di tale stringa. Come hai fatto a farlo funzionare? Puoi pubblicare la tua soluzione in qualche modo? – Houman
Avevo fretta nelle mie prove. Hashtable non viene mantenuto tra le esecuzioni dell'applicazione con la classe delle impostazioni di default. Tuttavia, se è fondamentale per te avere un Hashtable e non ti preoccupare del lavoro manuale, puoi controllare la mia risposta. –