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);
}
}
}