2009-05-26 5 views
4

J'ai rencontré des problèmes lors de la tentative de sérialisation de mon objet en XML. Le problème apparaît lorsque vous tentez de sérialiser une propriété "Profils" qui est un élément Liste des profils. Le profil est mon propre type. Le type de profil devrait idéalement être abstrait, mais ce n'est pas le cas puisque la sérialisation XML exige un ctor sans paramètre. La propriété Profiles contient des éléments de type "IncomeProfile", "CostProfile", "InvestmentProfile" etc., qui bien sûr héritent de Profile.Sérialisation d'une liste <T> en XML avec héritage

Comme je l'ai lu, la sérialisation n'est pas supportée nativement, puisque XmlIncludeAttribute n'autorise qu'un type hérité. C'est à dire.

[XmlInclude(typeof(IncomeProfile))] 
public List<Profile> Profiles { get; set; } 

Quelle est la meilleure pratique pour résoudre ce problème? J'ai essayé différentes solutions en utilisant IXmlSerializable et la réflexion, cependant je n'arrive pas à désérialiser chaque profil au bon type (elles finissent toutes par utiliser la méthode ReadXml (XmlReader reader) du type Profile, même si le débogueur Visual Studio dit . le type de l'objet est « IncomeProfile » ou « CostProfile » Ceci est mon code actuel de désérialisation, qui désérialise le code XML en trois objets profil, au lieu de deux IncomeProfile et un CostProfile:

while(reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "Profile") 
    { 
     String type = reader["Type"]; 
     var project = (Profile)Activator.CreateInstance(Type.GetType(type)); 
     project.ReadXml(reader); 

     reader.Read(); 
     this.Profiles.Add(p2); 
    } 

Toutes les pensées ou suggestions très apprécié!

+0

(répondu à un commentaire) –

Répondre

10

Vous êtes autorisé à utiliser plusieurs comprennent des attributs - bien qu'ils soient ensemble plus souvent contre le type lui-même:

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 
[XmlInclude(typeof(IncomeProfile))] 
[XmlInclude(typeof(CostProfile))] 
[XmlInclude(typeof(InvestmentProfile))] 
public class Profile { 
    public string Foo { get; set; } 
} 
public class IncomeProfile : Profile { 
    public int Bar { get; set; } 
} 
public class CostProfile : Profile { } 
public class InvestmentProfile : Profile { } 
static class Program { 
    static void Main() { 
     List<Profile> profiles = new List<Profile>(); 
     profiles.Add(new IncomeProfile { Foo = "abc", Bar = 123 }); 
     profiles.Add(new CostProfile { Foo = "abc" }); 
     new XmlSerializer(profiles.GetType()).Serialize(Console.Out, profiles); 
    } 
} 
+0

J'ai essayé ce qui suit sur la propriété des profils qui ne fonctionne pas: [XmlInclude (typeof (IncomeProfile)), XmlInclude (typeof (CostProfile))] Toutefois, lorsque je les ai définis sur la classe Profile, cela a fonctionné. J'étais si proche et j'ai passé tant d'heures à essayer d'écrire ma propre implémentation des méthodes de sérialisation. Un peu irritant, mais merci beaucoup :) – atsjoo

+0

Y at-il une différence entre ce qui suit? A: [XmlInclude (typeof (IncomeProfile)), XmlInclude (typeof (CostProfile))] B: [XmlInclude (typeof (IncomeProfile))] [XmlInclude (typeof (CostProfile))] – atsjoo

+0

aucune différence. –

3

Il vous suffit d'utiliser plusieurs attributs [XmlInclude]. Cela fonctionne bien.

Questions connexes