8
votes

C #: Pour être XML sérialisable, les types qui héritent d'iEnumérables doivent avoir une implémentation d'ajouter (System.Object)

J'ai le code suivant: xxx

lors de l'initialisation du sérialisateur, je reçois l'exception:

Pour être XML sérialisable, les types qui héritent d'iEnumérables doivent avoir un Mise en œuvre de l'ajout (système.Object) à tous les niveaux de leur hiérarchie d'héritage.

microsoft.exchange.webservices.data.finditemResults ne met pas en œuvre Ajouter (System.Object). < / strong>

J'ai cherché autour de vous et je suis arrivé à la conclusion que je dois ajouter une méthode d'addition publique (objet obj). Maintenant, je ne suis pas vraiment sûr de ce que cette méthode doit contenir ou quand elle est appelée, quelqu'un peut-il me dire dans la bonne direction? Est-ce que la méthode ajoutez doit ajouter manuellement chaque rendez-vous?

Quelques liens que j'ai trouvés utiles: ici ici < / p>

très apprécié.


0 commentaires

3 Réponses :


1
votes

Vous devez implémenter une méthode d'ajout capable de mettre un objet du type que votre iEnumérable contienne dans l'iEnumerable lorsque vous désérialisez votre FinditemSResult et les objets contenus donnés par elle. Un iénumérable n'est pas comme une liste, un élément désérialisé ne peut donc pas être de manière générique simplement dans un conteneur de quelque sorte. Il n'ya aucun moyen de savoir comment créer une classe qui implémente iEnumérable, vous devez explicitement écrire une méthode d'addition.


2 commentaires

J'ai mis en œuvre la méthode d'ajout comme indiqué, malheureusement, la même exception est toujours soulevée. EDIT: Je n'ai pas appelé la méthode Ajouter - Comment ferais-je cela? Var Serializer = Nouveau XMLSerializer (rendez-vous.getType (). Ajouter ()) ;? Nope, ça ne marche pas ...


Votre méthode d'ajout prend-elle un objet d'objet de classe comme argument? Je pense que la méthode d'ajout serait appelée automatiquement lorsque vous essayez de désérialiser un objet implémentant iEnumerable.



4
votes

Le Ajouter () doit avoir un seul argument du type des éléments dans l'objet iEnumerable . Par exemple, si FINDITEMSRESULTS implémente iEnumerable alors vous pouvez ajouter une méthode add Ajouter (t t) . Si vous souhaitez FINDITEMSRESULTS Pour être en lecture seule, vous pouvez convertir FINDITEMSRESULES vers une liste via la méthode Tolist () PROCÉDON ET SERIALISER LA LISTE que le FINDITEMSRESULESSULES objet lui-même.


2 commentaires

J'ai converti le FinditemsResults rendez-vous sur une liste et sérialisé cela. Cependant, maintenant, je reçois une exception: Microsoft.Exchange.webservices.data.appointment ne peut pas être sérialisé car il n'a pas de constructeur paramétré . Des idées?


Vous obtenez probablement cette erreur car quelque chose dans le graphique Objet FinditemSResults n'est pas directement sérialisé avec XMLSerializer. Vous pouvez essayer DatacontractSerializer, qui est un peu plus robuste, ou couvrant le graphe FinditemSResultsObject dans un format plus simple (POCO DTO)



1
votes

J'ai couru dans ce même problème lors de la création d'un objet de résultat paginé. La réponse sélectionnée est essentiellement correcte mais je pensais que je voudrais simplement le formater un peu plus agréable et ajoute également un bout de mes propres.

En gros, j'ai mis en place l'ajout, mais je dois juste jeter une exception pour guider tous les futurs développeurs qui peuvent Essayez de l'appeler depuis en tant que jeu, je veux le garder en lecture seule. Le sérieleur fonctionne toujours bien, donc cela n'applique évidemment jamais ajouter lors de la sérialisation. Je peux courir dans des problèmes de dés-sérialisation, mais puisque cet objet est purement destiné à récupérer un ensemble de résultats, tout devrait être bon. P>

Voici ce que j'ai ajouté à la classe qui avait mis en œuvre iEnumérable: P>

    public void Add(T value)
    {
        throw new NotSupportedException("Add is not supported for paged results.  Try adding new items to the repository instead.");
    }


0 commentaires