J'ai une structure comme ceci: la liste contient des objets de type B et C Ils ont également des champs que je voudrais conserver, puis-je maintenant le sérialiser, désérialiser le dos et obtenir les cas d'objet appropriés?
De préférence à xml p> edit: p> existe un moyen simple de sérialiser cette liste contenant des interfaces, puis de les désérialiser les instances B et C? P> P> P> P> P> P> P> P> P> P> >
6 Réponses :
Oui, mais vous devez jouer avec les attributs xmlelement, xmlroot et xmlarray. Chaque type a besoin de son propre nom d'élément.
Edit: Quelques échantillons de code. Toutes les classes sont dérivées d'une classe de base commune. P>
Voici un exemple de code: p> modifier: supprimer l'attribut de sérialisation telle qu'elle n'est pas nécessaire (mais c'est nécessaire dans mon projet où le code est de) p> p>
Vous n'avez pas besoin de [sérialisable] code>. Il n'est pas utilisé par la sérialisation XML.
En supposant que vous utilisez la sérialisation intégrée XML XML, vous devez consulter l'attribut suivant:
System.Xml.Serialization.XmlIncludeAttribute
Pour votre cas, faites une classe abstraite qui implémente votre interface comme: puis dérivez vos classes de ABS p> et
Liste de liste; p> Utilisez maintenant XMLinclincLUDeattribute pour ajouter vos types dans la matrice de type XMLSerializer. p> p>
J'utiliserais une classe abstrait au lieu d'une interface (comme on ne peut pas sérialiser un type d'interface), puis au lieu de coder le type du type à l'aide de l'attribut xmlinclude, j'ajouterais les types connus au XMLSérializer dans la série et désexirés méthodes telles que:
Convertissez l'interface en classe abstraite, puis utilisez ou p>
Mettre en œuvre ou p>
envisagez d'utiliser xmlSerializer code> ne fonctionne pas avec des interfaces. Donc, vous pouvez: p>
xmlincludattribute code> pour celui-ci ou fournissez des types connus à
xmlSerializer code> p> p>
ixmlSerializable code> pour le type parent p>
DatacontractSerializer code >
de .NET 3.0 P>
Vous pouvez essayer d'utiliser DataContractSerializer :
public interface A { } public class B : A { } public class C : A { } class Program { static void Main(string[] args) { List<A> list = new List<A>(new A[] { new B(), new C() }); var serializer = new DataContractSerializer( list.GetType(), new[] { typeof(B), typeof(C) }); var sb = new StringBuilder(); using (var stringWriter = new StringWriter(sb)) using (var writer = XmlWriter.Create(stringWriter)) { serializer.WriteObject(writer, list); } using (var stringReader = new StringReader(sb.ToString())) using (var reader = XmlReader.Create(stringReader)) { list = (List<A>)serializer.ReadObject(reader); } } }