8
votes

XMLSerializer Convertir l'objet C # à la chaîne XML

J'ai créé une classe C #: xxx

mais est lorsque j'utilise XMLSerializer Convert en chaîne XML. Le résultat n'est pas le même que ci-dessous XML.

Quel est le problème de ma classe C #? Je veux utiliser XmlSerializer pour aller sur le résultat au lieu d'utiliser Xmldocument.

Des idées? Merci d'avance! xxx


edit

ci-dessous est mon code C # et le résultat de la sortie: xxx

xml: xxx


5 commentaires

Publiez la sortie du xmlSerializer?


"Le résultat n'est pas le même que ci-dessous XML" - comment c'est "pas le même"? Qu'est-ce que vous obtenez à la place? (Note latérale: Vous utilisez un format inhabituel pour les dates de XML - ISO8601 AAAA-MM-DD)


Si vous faites une sérialisation XML, vous ne pouvez pas obtenir votre XML personnalisé


En fait Mac, vous pouvez. Vous devez attribuer les propriétés à modifier leurs noms d'éléments, mais vous pouvez.


Vous pouvez obtenir une telle sortie à l'aide de la mise en œuvre de ixmlSerializable Attribut - Voir 3ème résumé dans ma réponse.


4 Réponses :


9
votes

Vous ne pouvez pas sérialiser la classe de votre question à l'aide des outils de sérialisation standard de sorte qu'il dispose d'entrées au même niveau que noeud. Lorsque la classe enregistrée avec la liste des outils de sérialisation standard de votre sera toujours imbriquée dans un noeud de tableau distinct qui sera au même niveau que noeud. Mêmes préoccupations enregistrements champs sur book classe.

pour générer xml sortie que vous souhaitez - avec nœuds au même niveau que nœud - Vous devrez mettre en place IxmlSerializable interface dans votre Books classe pour la sérialisation personnalisée. Pour voir des exemples de ixmlSerializable Mise en œuvre Visitez ces liens: Stackoverflow répond , Article de codeProject .

Une autre solution sera - comme a déclaré utilisateur Alexandr en commentaire à ma réponse - Pour hériter de votre Livres Classe à partir de Liste Type et pour avoir sur votre Book Classe enregistrements du type de classe hérité de Liste type .

Lors de la série de sérialisation de votre question, en supposant que votre adéquation xmlroot, xmelement, xmlarray et xmlarrayitem attributs comme suit: xxx

vous obtiendrez xml Sortie comme suit: xxx


6 commentaires

T'es sûr de ça? Parce que je pense que je pense que je l'ai fait il y a quelque temps en ayant la classe racine ( livres dans ce cas) étendre list puis appliquez les propriétés avec Xmelement -Attribuer ...


@ALXANDR La liste d'héritage est une autre option - il change d'autres conditions du problème. +1 pour une bonne idée.


Je suppose également que cela est faisable sans hériter de la liste, simplement en fournissant une méthode ajouter , mais je ne sais pas comment les internes du XMLSérialiseur fonctionnent ...


@ALXANDR Après une recherche rapide avec Google, j'ai trouvé des solutions avec Ajouter Méthode - Ce que je suis venu n'est que des variations différentes avec ixmlSerializable . Appréciera les liens vers des solutions alternatives.


Ce n'était qu'une supposition basée sur le fait que la méthode Ajouter active des trucs comme var a = nouvelle liste () {"A", "B", "C"; aussi, Liste ne semble pas implémenter ixmlSerializable , bien qu'il s'agisse d'être un constructeur de sérialisation pour tout ce que je sais. Je viens de comprendre que depuis que .NET donne une signification particulière à une méthode ajouter , peut-être que le XMLSerializer fait aussi ...


Je n'ai pas trouvé de constructeur de sérialisation en utilisant justdecompile. Peut-être que list ou ilist ou icollection est manipulé explicitement par le XMLSerializer?



8
votes

J'ai fait passer la modification suivante à votre code de classe. Je ne suis pas en mesure de dupliquer la sérialisation XML à l'aide du sérialiseur par défaut, car il ne dupliquera pas l'élément "Enregistrement" sans lui donner un élément de conteneur. xxx

sérialiser cela me donne la sortie suivante xxx

à l'aide de ce code de test xxx < / p>


2 commentaires

Nous ne pouvons pas laisser le et être le même niveau?


Les livres sont l'élément de conteneur pour le livre. C'est ainsi que cela sait qu'ils appartiennent à la même propriété lors de la réémarrage.



4
votes

Je me rends compte que cela fait quelques années de retard, mais j'ai pu réaliser la structure que vous avez désirée simplement en utilisant xmleementattribute .

J'ai découvert cela en utilisant xsd.exe pour générer des définitions de schéma à partir de XML et générer un code .NET à partir de fichiers XSD. Autant que je sache, cela fonctionne dans .NET 3.5 à 4.6. P>

Voici la définition de la classe que j'ai utilisée: p> xxx pré>

et voici un linqpad extrait qui illustre la sérialisation / la désérialisation (basé sur l'extrait de code de David Colwell, merci Btw pour la pointe de l'exclusion Bom, c'était juste ce que je cherchais): p> xxx pré>

Ce XML produit peut être sérialisé et désérialisé sans implémenter ixmlSerializable, tels que: P>

<books>
  <bookNum>2</bookNum>
  <book>
    <name>book 1</name>
    <record>
      <borrowDate>2/2/2016 5:57:25 PM</borrowDate>
      <returnDate>2/2/2016 5:57:25 PM</returnDate>
    </record>
  </book>
  <book>
    <name>book 2</name>
    <record>
      <borrowDate>2/2/2016 5:57:25 PM</borrowDate>
      <returnDate>2/2/2016 5:57:25 PM</returnDate>
    </record>
    <record>
      <borrowDate>2/2/2016 5:57:25 PM</borrowDate>
      <returnDate>2/2/2016 5:57:25 PM</returnDate>
    </record>
  </book>
</books>


1 commentaires

Votez pour l'idée d'utiliser XSD.exe pour créer une classe à partir du XML souhaité! Va ajouter cela à mon sac à outils.



0
votes

Si vous avez besoin d'autres classes, telles que Book2 à l'intérieur de la classe de livres, vous avez des instructions spéciales pour la mettre en œuvre. Exemple xxx

Lorsque j'essaie d'exécuter le programme, j'ai l'erreur suivante:

"Informations supplémentaires: Erreur lors de la réflexion du type"


1 commentaires

Veuillez modifier la réponse pour élaborer sur le sujet des instructions spéciales.