2009-07-10 8 views
2

Je dois être en mesure de sérialiser/désérialiser un dictionnaire en une chaîne lisible par l'homme (et s'il s'agit d'une chaîne humaine modifiable) (XML ou Json de préférence).Quelle est la meilleure façon de sérialiser/désérialiser un Dictionary <String, String> dans .Net 2.0?

J'ai seulement besoin de travailler avec des dictionnaires de chaînes, pas d'autres types d'objets d'aucune sorte. Les chaînes, cependant, sont supposées être du texte libre, donc elles peuvent avoir des caractères comme des guillemets simples/doubles, etc., donc elles doivent être encodées/échappées correctement.

Ce projet est basé sur .Net 2.0, donc je ne peux malheureusement pas utiliser JSON.Net.

Des idées quelle est la meilleure façon de le faire rapidement?

Je pourrais évidemment écrire mon propre code pour faire ceci, mais je m'attends à trouver beaucoup de maux de tête d'échappement si je vais par là, particulièrement sur la partie désérialisante.

Toutes les idées seront appréciées.
Merci!
Daniel

Répondre

0

Mettez en œuvre IXmlSerializable, ce sera très facile.

Code Pseudo:

public class CoolHash : Dictionary<String, String>, IXmlSerializable 
{ 
    void WriteXml(XmlWriter writer){ 
    foreach(string key in this.Keys){ 
     writer.WriteElementText(key, this[key]); 
    } 
    } 
} 
+0

Des pointeurs sur l'implémentation de la partie ReadXML? –

+0

De la même manière, XmlReader a toutes les informations, vous pouvez donc facilement naviguer dans les nœuds et simplement définir le nom de tag comme valeur de clé et d'élément en tant que valeur. Vous pouvez trouver des exemples de lecture de fichiers XML avec XmlReader dans la documentation XmlReader. –

1

Je pense que la meilleure façon est de créer une classe wrapper qui est facilement sérialisable dans le sérialiseur XML et covertible vers et depuis le Dictionary<string,string>. Cela le rendra facilement modifiable et éliminera tous les problèmes d'échappement.

Par exemple

public class Wrapper { 
    public List<string> Keys {get; set; } 
    public List<string> Values {get; set; } 
    public Wrapper() {} 
    public Wrapper(Dictionary<string,string> map) { 
    Keys = new List<string>(map.Keys); 
    Values = new List<string>(map.Values); 
    } 
    public Dictionary<string,string> GetMap() { 
    Dictionary<string,string> map = new Dictionary<string,string>(); 
    for (int i = 0; i < Keys.Length; i++) { 
     map[Keys[i]] = Values[i]; 
    } 
    return map; 
    } 
} 
2

Pour autant que je sais qu'il ya maintenant trois solutions pratiques faciles cette situation:

1) JSON.Net, qui fonctionne en .Net 2.0 avec un binaire séparé (rend les choses vraiment faciles, et json est un format sympa, plus compact que xml).

2) Une Serializable mise en œuvre Dictionnaire, par exemple à: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx (S'il vous plaît noter que cette version ne gère pas binaire sérialisation (BinaryFormatter) en raison des disparus constructeurs et disparus « [Serializable] » attribut, mais cela prend 2 minutes pour fixer - Je souhaite que l'auteur mettrait à jour le poste!)

3) SharpSerializer, rend également les choses v facile, bien que la sortie Xml est assez volumineuse par défaut (n'ont pas essayé de jouer avec les paramètres).

Désolé d'être posté si tard, mais je ne sais pas pourquoi la question languit comme sans réponse et je pense que l'une de ces réponses aiderait le chercheur occasionnel! MISE À JOUR: Apparemment, j'ai manqué un, NXmlSerializer, bien que je n'ai pas joué avec celui-ci - je ne sais pas comment il se compare avec les autres.

Questions connexes