11
votes

Existe-t-il un moyen de rendre DatacontractSerializer Sortie Nettoyant XML?

Utilisation du DataContractSerializer Pour sérialiser mon objet, je reçois une sortie similaire à xxx pré>

y a-t-il un moyen de sortir des balises qui ne sont que P>

<Id>
<Name>


2 commentaires

N ° et arrêtez de vous inquiéter de la façon dont votre XML looke. Cela ne conduit que de chagrin.


Vous devriez faire une réponse.


4 Réponses :


1
votes

Le DatacontractSerializer Serialisera toutes les propriétés publiques (si vous ne spécifiez rien - possible à partir de .NET 3.5 SP1) ou (l'approche que je préfère) tout ce que vous étiquetez avec un [Datamember ] attribut.

Donc, le meilleur que vous puissiez faire est de marquer votre classe avec un [Datacontract] attribut et tous les membres (propriétés, champs, etc.) que vous voulez vraiment dans votre contrat de données avec un < code> [Datamember] attribut.

Le DatacontractSerializer ne permet pas vraiment beaucoup plus de contrôle que cela - vous pouvez définir assez clairement (à l'aide de cette approche «opt-in« opt-in »explicite) ce que est sérialisé, mais vous avez peu ou pas de contrôle sur comment est sérialisé.

Mais avez-vous vraiment besoin de cela? Vraiment?

Si tel est le cas, vous devrez probablement utiliser le XMLSerializer pour ce processus de sérialisation à la place - là, vous pouvez obtenir plus de contrôle sur comment choses sont sérialisées (mais comme un inconvénient, le XMLSerializer sera sérialisé tous les Propriété publique non explicitement marquée d'un [xmlignore] attribut - un schéma "Opt-out").

Découvrez dan rigsby's Poste de blog sur les différences entre DatacontractSerializer et XMLSerializer et ce que chacun a à offrir.


4 commentaires

Je souhaite que c'est sérialiser toutes les propriétés, XMLSerializer n'est même pas une option puisque mon objet a une iliste dedans. Je posais des questions sur le schéma de dénomination car il serait plus facile dans mon docs de transformation si les propriétés correspondaient exactement à mes objets de classe.


Avez-vous décoré votre classe et vos propriétés avec des attributs [Datamember]? Vous pouvez définir un nom avec ceux: [Datamember (nom = "xyz")] - Est-ce que cela aide dans votre cas?


Avez-vous décoré les classes qui se retrouveront dans votre IList avec l'attribut [Datacontract] et [Datamember]? Il semble presque comme si tu ne l'as pas ...


CORRECT, je n'ai utilisé aucun des attributs qui est ce que toute ma question est pivotale, je refuse de polluer mon modèle de domaine pour la présentation, c'est pourquoi je serai sérialisé à XML pour faire des transformations XSLT pour la génération de documents.



5
votes

Les noms d'éléments longs (tels que: _x003c_created_x003e_k__backingfield) sont créés par .NET lorsque vous utilisez des autoproperties.

Si vous les avez changées en propriétés avec des champs de support, ils utilisent plutôt vos noms de champ de support. Vous pouvez le faire sans ajouter aucun attributs à votre code.

(au-delà de cela, il suffit d'ajouter un attribut [Datacontract] à votre définition de classe rangera beaucoup votre XML - bien que pas complètement.)


2 commentaires

Je vais devoir vérifier quelle différence qui fait, je peux accepter de placer un attribut au niveau de la classe, en particulier depuis que ces classes sont des données de données, même si elles ne sont pas exposées par WCF


Je suis intéressé par votre expérience. La sérialisation semble mal définie et souffre de plusieurs solutions.



0
votes

J'ai rencontré le même problème, enfin, il vous suffit d'ajouter [DataContract] 和 [Datamember] au modèle.


1 commentaires

Cette réponse a été automatiquement marquée comme de la qualité médiocre en raison de sa longueur et de sa teneur. Brevity est acceptable, mais des explications plus complètes sont meilleures.



9
votes

Ceci se produit car vous devez avoir marqué vos types (par exemple, agentNotification ) avec [sérialisable] . Lorsque DatacontractSerializer rencontre un type marqué avec [sérialisable] mais pas explicite [Datacontract] , il génère un contrat par défaut pour le type qui correspond à comment Binarinformatter Serialise une classe, qui consiste à sérialiser Tous Variables des membres d'une classe - même variables marquées comme privées - par nom. Pour Propriétés mises en œuvre automatiquement , cela signifie que le Champs de support secrets Sérialisés par nom; Leurs noms sont les noms d'éléments particuliers que vous voyez.

Le moyen le plus simple de résoudre ce problème est de supprimer l'attribut [sérialisable] de vos classes. Vous n'en avez presque certainement pas besoin, à moins que vous n'utilisiez réellement Binarinformatter ou SOAPPORTER . L'avoir fait, DatacontractSerializer Serialisera désormais vos propriétés et champs publics par nom, plutôt que des champs publics et privés par nom.


1 commentaires

Cela aurait probablement été ce que je voulais il y a 6 ans. Mais à un moment donné, je viens d'arrêter d'utiliser XSLT et de commencer à utiliser Postal + Razorviewengine pour générer du contenu par courrier électronique.