11
votes

Série XML .NET XML et héritage

J'ai une structure comme ceci: xxx

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

edit:

existe un moyen simple de sérialiser cette liste contenant des interfaces, puis de les désérialiser les instances B et C? >


0 commentaires

6 Réponses :


4
votes

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.

Voici un exemple de code: xxx

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)


1 commentaires

Vous n'avez pas besoin de [sérialisable] . Il n'est pas utilisé par la sérialisation XML.



6
votes

En supposant que vous utilisez la sérialisation intégrée XML XML, vous devez consulter l'attribut suivant:

System.Xml.Serialization.XmlIncludeAttribute


0 commentaires

0
votes

Pour votre cas, faites une classe abstraite qui implémente votre interface comme: xxx

puis dérivez vos classes de ABS xxx

et Liste de liste;

Utilisez maintenant XMLinclincLUDeattribute pour ajouter vos types dans la matrice de type XMLSerializer.


0 commentaires

5
votes

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: xxx


0 commentaires

0
votes

xmlSerializer ne fonctionne pas avec des interfaces. Donc, vous pouvez:

Convertissez l'interface en classe abstraite, puis utilisez xmlincludattribute pour celui-ci ou fournissez des types connus à xmlSerializer

ou

Mettre en œuvre ixmlSerializable pour le type parent

ou

envisagez d'utiliser DatacontractSerializer de .NET 3.0


0 commentaires

4
votes

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

    }
}


0 commentaires