Pourquoi XmlSerializer ne supporte-t-il pas Dictionary?

Juste curieux de savoir pourquoi Dictionary n’est pas supporté par XmlSerializer ?

Vous pouvez le contourner facilement en utilisant DataContractSerializer et en écrivant l’object dans un XmlTextWriter , mais quelles sont les caractéristiques d’un dictionnaire qui rendent difficile pour un XmlSerializer de considérer qu’il s’agit vraiment d’un tableau de KeyValuePairs.

En fait, vous pouvez transmettre un IDictionary à une méthode qui attend un IEnumerable<KeyValuePairs> .

    Les tables de hachage nécessitent généralement un fournisseur de hachage et d’égalité. Ceux-ci ne peuvent pas être sérialisés facilement en XML, et ne seront certainement pas portables.

    Mais je pense que vous avez déjà trouvé votre réponse. Il suffit de sérialiser la table de hachage sous la forme d’une List> et de la (re) construire dans une table de hachage.

    C’est un peu tard, mais j’ai trouvé cette question en cherchant moi-même la réponse et j’ai pensé partager ma réponse qui était de remplacer XmlSerializer par un autre outil qui sérialiserait tout:

    http://www.sharpserializer.com

    Cela a fonctionné pour moi tout de suite, en sérialisant les dictionnaires et les types personnalisés multicouches, et même les génériques utilisant des interfaces comme arguments de type. A également une licence entièrement permissive.

    Merci Pawel Idzikowski!

    Vous pouvez utiliser ExtendedXmlSerializer . Si vous avez un cours:

     public class TestClass { public Dictionary Dictionary { get; set; } } 

    et créer une instance de cette classe:

     var obj = new TestClass { Dictionary = new Dictionary { {1, "First"}, {2, "Second"}, {3, "Other"}, } }; 

    Vous pouvez sérialiser cet object en utilisant ExtendedXmlSerializer:

     var serializer = new ConfigurationContainer() .UseOptimizedNamespaces() //If you want to have all namespaces in root element .Create(); var xml = serializer.Serialize( new XmlWriterSettings { Indent = true }, //If you want to formated xml obj); 

    Le xml de sortie ressemblera à:

         1 First   2 Second   3 Other    

    Vous pouvez installer ExtendedXmlSerializer à partir de nuget ou exécuter la commande suivante:

     Install-Package ExtendedXmlSerializer