7 votes

RuntimeType:http://schemas.datacontract.org/2004/07/System' n'est pas attendu

Ok, j'ai réussi à faire fonctionner DataContractSerializer avec mon graphe d'objets. Voir mes questions précédentes pour plus d'informations.

Sérialisation / dérialisation d'une structure arborescente

Le désérialiseur n'a pas connaissance d'un type qui correspond à ce contrat.

Cependant, l'un de mes domaines, _UserPropertyDefinitions est défini comme indiqué ci-dessous. Il définit une liste de propriétés personnalisées que cet utilisateur peut ajouter aux objets de la structure de données. La chaîne est une clé unique pour identifier la propriété, et le Type est le type de la propriété qui est toujours un type primitif comme Bool, Int, String etc etc

À chaque objet correspond un Dictionary(String key, Object value) pour stocker les valeurs qu'il a définies pour l'une des "propriétés de l'utilisateur".

[DataMember]
private Dictionary<string, Type> _UserPropertyDefinitions;

Mon graphe d'objets se sérialise bien lorsque cette propriété est une collection vide, mais dès que j'ajoute une propriété personnalisée à cette collection, j'obtiens l'exception suivante lorsque j'essaie de la sérialiser avec DataContractSerializer.

Type 'System.RuntimeType' avec données nom du contrat 'RuntimeType : http://schemas.datacontract.org/2004/07/System ' n'est pas attendu. Ajoutez tout type non connu statiquement à la liste des types connus - par exemple, en utilisant la méthode KnownTypeAttribute ou en utilisant l'attribut en les ajoutant à la liste des types connus transmise à DataContractSerializer.

Si je supprime l'attribut DataMember de ce champ, je peux effectuer une sérialisation/désérialisation sans obtenir d'exception, mais je perds bien sûr les paramètres que j'ai créés dans ce champ.

7voto

Marc Gravell Points 482669

Je suis presque sûr que Type ne va pas sérialiser très bien - et on peut dire qu'il n'a pas sa place dans un contrat de données de toute façon, puisque (étant spécifique à l'implémentation) il va à l'encontre de l'un des principaux objectifs d'un contrat de données...

Cependant, je pense que la meilleure approche serait d'échanger cela contre une Dictionary<string,string> en utilisant le Type 's AssemblyQualifiedName o FullName .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X