Comment puis-je lire et à écrire en C# string Dictionnaire dans un fichier?
J'ai un Dictionnaire d'objet et je veux écrire sur le disque et être en mesure de le lire à partir du disque. Idéalement, j'aimerais éviter un 3ème partie les bibliothèques. Est-il une façon simple de le faire régulièrement C# 4?
RÉPONSE ACCEPTÉE.
Résumé:
OPTION 1 - à l'Aide de JavaScriptSerializer
Pour: Pas de 3ème partie de la bibliothèque nécessaire. Aussi, utilise plus moderne format, c'est à dire JSON
Contre: Difficile à lire (pas formaté. Aussi, a besoin de référence à moins couramment utilisés par le Système.Web.L'Extension de l'assemblée, même lorsque l'application n'a rien à voir avec le web.
Solution:
Écrire:
File.WriteAllText("SomeFile.Txt", new JavaScriptSerializer().Serialize(dictionary));
Lire:
var dictionary = new JavaScriptSerializer()
.Deserialize<Dictionary<string, string>>(File.ReadAllText("SomeFile.txt"));
OPTION 2 - à l'Aide de Linq to Xml
Pour: Pas de 3ème partie de la bibliothèque nécessaire. N'a généralement pas besoin d'ajouter d'autres références. Facilement lisible.
Contre: XML n'est pas aussi souhaitable que quelque chose de plus moderne, tels que JSON.
Écrire:
new XElement("root", d.Select(kv => new XElement(kv.Key, kv.Value)))
.Save(filename, SaveOptions.OmitDuplicateNamespaces);
Lire:
var dictionary = XElement.Parse(File.ReadAllText(filename))
.Elements()
.ToDictionary(k => k.Name.ToString(), v => v.Value.ToString());
OPTION 3 - Utilisation JSON.NET
Pour: lisible par l'Homme. Format moderne.
Contre: 3ème partie de la bibliothèque nécessaire.
Solution:
Écrire:
File.WriteAllText("SomeFile.Txt", JsonConvert.SerializeObject(dictionary));
Lire:
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>
(File.ReadAllText("SomeFile.txt"));
Vous pouvez également utiliser la sérialisation XML: web.archive.org/web/20100703052446/http://blogs.msdn.com/b/...
killermonkey50, je vous remercie. J'ai remarqué que les plus âgés intégré sérialiseur pour xml ne prend pas en charge les dictionnaires, de sorte que vous devez créer votre propre wrappers comme vous l'avez indiqué. Je pense que c'est mieux d'utiliser LINQ étant donné que le code est beaucoup plus petit, au moins pour le cas d'utilisation spécifiques dont je parle.
IDictionary n'est pas pris en charge par XmlSerializer.
Je sais, cette solution crée une Entrée de la classe et utilise des listes pour le stocker. Pas de la façon la plus élégante de le faire, mais il fonctionne.
OriginalL'auteur zumalifeguard | 2014-11-19
Vous devez vous connecter pour publier un commentaire.
Sans une Tierce Partie comme JSON.Net, Utilisez
JavaScriptSerializer
:Arriver dictionnaire arrière à partir d'un fichier:
Seule chose à se rappeler est d'ajouter une référence à
System.Web.Extensions
dans les références du projet et ensuite, vous serez en mesure d'utiliserJavaScriptSerializer
aprèsusing System.Web.Script.Serialization;
Ou avec JSON.Net vous pouvez sérialiser votre dictionnaire JSON et puis les écrire dans un fichier, puis de le désérialiser, comme:
Stockage de Dictionnaire dans le fichier:
Arriver Dictionnaire arrière à partir d'un fichier:
Pour la comparaison entre les deux options, voir: JSON.NET JsonConvert vs .NET JavaScriptSerializer
I would avoid any 3rd party libraries.
Habib, je comprends que cela fonctionne, mais une meilleure solution serait de ne pas exiger une 3ème partie de la bibliothèque.
modifié la réponse à inclure .Net option.
umm qu'entendez-vous, JavaScriptSerializer n'est pas un tiers, il est fourni avec .Net framework.
Habib, merci pour votre réponse. Puis-je vous prie de supprimer les références à JSON.NET dans votre réponse? Il n'est pas clair pourquoi il est appelé. Il se lit comme vous l'indiquez deux manières différentes de le faire, mais si c'est le cas, vous devriez être plus explicite, "je le recommande deux solutions", et indiquer qui est qui. Il sera plus facile pour les lecteurs. Ma préférence serait de n'utiliser que le JavaScriptSerializer version.
OriginalL'auteur Habib
La façon la plus simple d'écrire Dictionnaire est de créer une liste de où chaque entrée du Dictionnaire est converti en XElement. Ensuite, vous créez une racine XElement où la liste est la valeur de la racine. La raison pour laquelle vous souhaitez utiliser un XElement est parce que vous pouvez ensuite utiliser c'est
Save
méthode pour stocker sur le disque au format XML. Exemple de ce que, en une seule ligne (où d est le Dictionnaire)Pour lire le fichier dans un Dictionnaire, d'utiliser l'analyse statique de la méthode de XElement et passer la totalité du contenu du fichier, qui peut lire avec
File.ReadAllText
. Analyser retourne un objet XElement, la racine. Vous pouvez ensuite effectuer une itération de laElements()
de la racine et de le convertir à un Dictionnaire. Vous pouvez le faire en une seule ligne:Voici une version de la ci-dessus enveloppé dans les méthodes:
L. B ne savez pas pourquoi vous demandez que. Je suppose que je vais vous donner les conserves de répondre qu'il n'est probablement pas utile pour un objet complexe.
Votre solution fonctionne uniquement pour les types de base, Si je voudrais écrire une solution, je préfère travailler avec
Dictionary<T1,T2>
L. B, on pourrait dire que T2 doit être roundtrippable à la chaîne par un mécanisme standard comme ToString et Analyser. Je ne pense pas que DateTime seraient admissibles. Donc, immédiatement, il serait de travailler avec des entiers, des flotteurs et des booléens. Un autre (ou d'autres), dont l'approche est lorsque T2, vous pourriez réfléchir à chaque membre de manière récursive à la recherche pour chaîne/analyser la combinaison. Vous pouvez également appuyer ISerialziable, etc. Mais vous savez, maintenant ça devient un peu complexe. Aussi loin que T1 (la clé), même chose, tant qu'il peut être converti vers/à partir d'une chaîne. 'cause de ces choses doivent se retrouver sur un disque et nous ne sommes pas à l'aide de binaire
But you know, now it's getting a bit complex.
Par conséquent, ne pas réinventer la roue et utiliser un sérialiseur qui fonctionne pour vous.OriginalL'auteur zumalifeguard