DataContractSerializer et Dictionnaire<string,object> n'est pas lors de la lecture
Je suis en utilisant DataContractSerializer
pour sérialiser un objet qui contient un Dictionary<string,object>
membre, qui est marquée par [DataMember()]
. L'idée est d'avoir une poche souple d'attributs d'un objet, et je ne sais pas ce que ces attributs pourraient être.
Cela fonctionne très bien quand je suis en train de mettre int
, double
et string
objets dans le dictionnaire, mais quand je mets un List<string>
dans il ne parvient pas à désérialiser l'objet avec:
System.InvalidOperationException: Node type Element is not supported in this operation.
La totalité du dictionnaire est sérialisé en XML, et il semble assez raisonnable:
<Attributes xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d2p1:KeyValueOfstringanyType>
<d2p1:Key>name</d2p1:Key>
<d2p1:Value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">Test object</d2p1:Value>
</d2p1:KeyValueOfstringanyType>
<d2p1:KeyValueOfstringanyType>
<d2p1:Key>x</d2p1:Key>
<d2p1:Value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:double">0.5</d2p1:Value>
</d2p1:KeyValueOfstringanyType>
<d2p1:KeyValueOfstringanyType>
<d2p1:Key>y</d2p1:Key>
<d2p1:Value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:double">1.25</d2p1:Value>
</d2p1:KeyValueOfstringanyType>
<d2p1:KeyValueOfstringanyType>
<d2p1:Key>age</d2p1:Key>
<d2p1:Value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:int">4</d2p1:Value>
</d2p1:KeyValueOfstringanyType>
<d2p1:KeyValueOfstringanyType>
<d2p1:Key>list-of-strings</d2p1:Key>
<d2p1:Value>
<d2p1:string>one string</d2p1:string>
<d2p1:string>two string</d2p1:string>
<d2p1:string>last string</d2p1:string>
</d2p1:Value>
</d2p1:KeyValueOfstringanyType>
</Attributes>
Note le list-of-strings
à la fin. Il a toutes les valeurs, mais rien n'indiquant que c'est un List<string>
ou quoi que ce soit.
Quelle est la bonne façon de gérer cette situation?
OriginalL'auteur Chris Herborth | 2011-10-01
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser le KnownTypeAttribute de sorte que
DataContractSerializer
sait à propos de laList<string>
type. Malheureusement, ce qui semble aller à l'encontre de votre idée de ne pas avoir à connaître les types avant de la main.Je suis en se fondant sur le code suivant, qui utilise
DataContractSerializer
de sérialiser unDictionary<string, object>
contenantList<string>
:Si vous
knownTypes
n'est pas fourni à l'DataContractSerializer
, elle lève une exception.OriginalL'auteur Jeff Ogata
WCF a aucun moyen de savoir que ce que vous avez est un
List<string>
il l'avis que tous les autres<Value>
éléments de type "hint" (le type de l'attribut). Si vous voulez désérialiser, il doit avoir le marquage, et vous devez également indiquer WCF quiList<string>
est un "type connu" - voir ci-dessous. Pour plus d'informations sur les types connus (et pourquoi ils sont nécessaires) il y a de nombreux bon ressources dans le web.OriginalL'auteur carlosfigueira
J'ai eu une idée similaire certain nombre de fois, et j'ai mis en place avec d'autres domaine de la tenue de l'assemblée les noms complets de tous les éléments dans le Dictionnaire. Il remplit la liste de chaque élément de plus ou de réécriture, puis l'utilise sur la sérialisation et utilise XmlReader pour extraire des informations de type, de construire la liste des types et désérialiser un objet.
Code:
OriginalL'auteur Андрей Саяпин