Dans .NET, vous pouvez sélectionner une hashtable comme type pour un utilisateur. Cependant quand je l'enregistre et le récupère de cette façon, il ne semble pas l'avoir sauvegardé du tout. Pourquoi ne le sérialise-t-il pas dans les paramètres utilisateurs, alors que je peux clairement sélectionner ce type dans Visual Studio? Je comprendrais si c'était le cas avec un type non listé comme dictionnaire, mais Hashtable est listé. Comment puis-je résoudre ce problème?
La simplicité et l'efficacité dans cet ordre ont la plus haute priorité pour moi.Comment stocker un HashTable dans les paramètres utilisateurs?
Merci beaucoup, Kave
mise à jour:
@Joao, Merci beaucoup la solution binaire. Je trouve ça assez intéressant, c'est propre. Un inconvénient avec la sérialisation en tant que binaire pourrait être le fait que vous ne pouvez plus rien changer dans le fichier usersetting manuellement. mais je pense que cela sera fait très rarement de toute façon, donc c'est une bonne solution. Je pensais à une approche différente pour créer un champ "XMLSetting" de type chaîne dans la portée de l'utilisateur et utiliser ce code pour stocker et récupérer les valeurs sous la forme d'un fichier XMl sérialisé dans une table de hachage. Mais je suis sûr que ce n'est pas le meilleur moyen, quelqu'un sait-il un meilleur moyen de sérialiser un hashtable/dictionnaire comme xml dans les paramètres utilisateurs, autre que ce que je fais ci-dessous?
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);
}
Je viens de tester la persistance d'une Hashtable en tant que paramètre utilisateur et j'ai détecté aucun problème. Si vous ne l'avez pas déjà fait, essayez de le faire à partir de zéro dans un nouveau projet de test. –
Salut, je viens de l'essayer à nouveau. Il continue à dire que le paramètre Properties.Settings.Default.Setting reste nul, même après avoir sauvegardé et redémarré l'application. Cela fonctionne avec d'autres types tels que la chaîne. Comment l'avez-vous fait fonctionner? Pouvez-vous poster votre solution en quelque sorte? – Houman
Je devais hâter mes tests. Le Hashtable n'est pas conservé entre les exécutions d'application avec la classe de paramètres par défaut. Cependant, s'il est vital pour vous d'avoir une table de hachage et que cela ne vous dérange pas d'un travail manuel, vous pouvez vérifier ma réponse. –