2010-04-26 5 views
2

Fondamentalement, le problème initial est que je dois faire une valeur booléenne sérialisée à 0 ou 1. La solution que j'ai trouvée consistait à implémenter IXmlSerializable, ce que j'ai fait. Malheureusement, la classe que j'essaie de sérialiser est du code généré sur un schéma et a un XmlTypeAttribute dessus. Lorsque je tente de (de) sérialiser l'objet avec le XmlSerializer créé de la manière habituelle (new XmlSerializer(type)), il lance cette exception:Implémentation d'IXmlSerializable sur une classe générée avec XmlTypeAttribute

System.InvalidOperationException: Only XmlRoot attribute may be specified for the type ______ Please use XmlSchemaProviderAttribute to specify schema type.

Deux possibilités viennent à l'esprit immédiatement:

1) retirer la attribut dans le code généré. Cette modification doit être effectuée chaque fois que le code a été généré à nouveau.

2) Utilisez un objet XmlAttributeOverrides lors de la création du sérialiseur pour supprimer l'attribut. Cela nécessiterait que le reste de la base de code "sache" qu'elle doit remplacer cet attribut. En outre, l'exception lancée ne donne absolument aucune idée de ce qui doit être fait pour le réparer.

Les deux options sont un peu puantes. Y a-t-il une troisième option?

+1

_why_ at-il l'attribut '[XmlType]'? –

+0

C'est juste la façon dont Xsd2Code l'a généré. Dire que le schéma que j'utilise est une bête massive est un euphémisme. Xsd.exe et d'autres outils ont écrasé ou craché 40 Mo de code en utilisant des bibliothèques personnalisées. Pour d'autres raisons, j'ai fini par devoir modifier le code généré. Cependant, s'il y a une troisième solution à ce problème, cela pourrait aussi fonctionner pour l'autre. –

Répondre

0

J'ai le même problème, pour moi supprimer les travaux IXMLSerializable, je ne l'utilise pas, et avez-vous essayé de cacher le vrai ou le faux avec une certaine logique dans les propriétés? Comme ceci:

private bool mblnFlag; 

public String Flag 
{ 
    get 
    { 
     return mblnFlag; 
    } 
    set 
    { 
     mblnFlag = (value == "1") 
    } 
} 

Bien sûr, vous devriez améliorer les propriétés et faire plus de vérification, mais c'est l'idée.

+0

J'ai contourné mon problème en commentant le XmlTypeAttribute, cependant modifier le code générateur me semble sale et j'espérais qu'il y avait une troisième option qui n'impliquait pas de modifier le code généré. Je suis probablement en train de rêver :( –

Questions connexes