2009-02-05 7 views
0

J'aime vraiment la méthode d'extension que TWith2Sugars a publiée here. J'ai rencontré un problème étrange cependant. Quand je mets cela dans une bibliothèque de classes partagées et appeler la fonction de sérialisation, je reçois l'erreur suivante:Problème avec les méthodes d'extension de sérialisation C#

The type MyType was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

Je regardais un peu et trouvé que les types XmlSerializer ne peut sérialiser qu'il est au courant. J'interprète cela comme signifiant des classes qui sont dans la bibliothèque de classes, pas le projet que je construis basé sur cette librairie.

Y a-t-il un moyen de contourner cela? Cette fonction peut-elle être placée dans une bibliothèque de classes ou doit-elle être dans chaque projet qui l'utilise?

Mise à jour:

je me suis dit ce qui était à l'origine du problème. J'avais le code suivant:

object o = new MyClass(); 
o.Serialize(); 

Cela causait l'erreur. Quand j'ai changé le code pour:

MyClass c = new MyClass(); 
c.Serialize(); 

Tout s'est bien passé. Donc, leçon apprise - n'essayez pas de (dé) sérialiser les objets génériques. Ce que j'ai le plus aimé à propos du lien que j'ai référencé, c'est que je n'avais pas besoin de mettre de tags d'attributs XML sur mes classes. La méthode d'extension vient de fonctionner. Pour terminer la question, j'accorderai la réponse à quiconque développera Marc's answer (Marc compris) avec un exemple de code illustrant l'utilisation de [XmlInclude].

Répondre

1

Votre compréhension est erronée. Ce que cette erreur signifie est fondamentalement le suivant: Le sérialiseur XML ne peut pas fonctionner sur les hiérarchies de classe à moins que vous ne lui disiez explicitement quelles classes sont présentes dans la hiérarchie. Ajoutez simplement l'attribut XmlInclude pour le type de chaque classe dérivée à votre classe de base et vous avez terminé.

0

Vous pouvez le faire dans cette source en ajoutant une référence au second assemblage et en utilisant [XmlInclude] - mais cela pourrait rapidement vous mettre dans un désordre circulaire de projets. Vous pouvez également spécifier ces options lors de l'exécution, dans le constructeur de la sérialiseur:

using System; 
using System.Xml.Serialization; 
[Serializable] public class Foo { } 
[Serializable] public class Bar : Foo {} 

static class Program { 
    static void Main() 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(Foo), 
      new Type[] { typeof(Bar) }); 
     ser.Serialize(Console.Out, new Bar()); 
    } 
} 

Re la méthode d'extension; vous pouvez ajouter un params Type[] extraTypes, et passer extraTypes dans le XmlSerializer - alors vous pouvez l'utiliser comme vous le faites maintenant, ou comme .Serialize(typeof(Bar)).

+0

Le problème que j'ai est que l'échec se produit en essayant de sérialiser Foo. Passer un extraType d'objet donne toujours la même erreur. –