2011-11-08 5 views
0

J'ai deux classes dont l'une est héritée de l'autre.XmlSerializer Sérialisation personnalisée

Par exemple Animal c'est une classe de base et Dog c'est une classe héritée.

J'ai rempli une collection de listes et je voudrais la sérialiser comme une collection de listes.

Est-ce possible?

string serializedResult = XmlSerializeHelper<List<Animal>>.Serialize(result.ToList()); 

Where result is a List<Dog> collection. 

et la mise en œuvre de XmlSerializeHelper est la suivante:

public class XmlSerializeHelper<T> where T : class 
{ 
    public static string Serialize(object o) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
     StringWriter stringWriter = new StringWriter(); 
     xmlSerializer.Serialize(stringWriter, o); 
     return stringWriter.ToString(); 
    } 
    public static T Deserialize(string xml) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
     StringReader stringReader = new StringReader(xml); 
     return (T)xmlSerializer.Deserialize(stringReader); 
    } 
} 

Répondre

0

Si vous avez une liste (j'utiliser généralement des listes-tableau pour cela), ajoutez les attributs XML pour toutes les classes dérivées

[XmlArray("Animal"), 
    XmlArrayItem("Dog", typeof(Dog)), 
    XmlArrayItem("Cat", typeof(Cat))] 
    public ArrayList Animals = new ArrayList(); 

Cela indique au sérialiseur quels types il peut attendre ...

... modifier ... Pour plus lisible faire, considérez ceci:

[Serializable] 
public class ListOfAnimals 
{ 
    public ListOfAnimals(){} 

    [XmlArray("Animal"), 
    XmlArrayItem("Dog", typeof(Dog)), 
    XmlArrayItem("Cat", typeof(Cat))] 
    public ArrayList Animals = new ArrayList(); 
} 

[Serializable] 
public class Animal 
    { 
     public Animal(){} 

     public Animal(string name) 
     { 
      Name = name; 
     } 
     public string Name{ get;set;} 
} 

[Serializable] 
public class Dog : Animal 
{ 
    public Dog(){} 

    public bool Vaccinated{ get;set; } 
} 

[Serializable] 
public class Cat : Animal 
{ 
    public Cat(){} 

    public bool Neutered{ get;set; } 
} 

puis appelez la sérialisation comme ceci:

ListOfAnimals result = new ListOfAnimals(); 

Dog puppy1 = new Dog(); 
Dog puppy2 = new Dog(); 
Cat kitty1 = new Cat(); 
Cat kitty2 = new Cat(); 

puppy1.Name = "Lassie"; 
puppy2.Name = "Yeller"; 
kitty1.Name = "Miauu"; 
kitty2.Name = "Scratchy"; 

result.Animals.Add(puppy1); 
result.Animals.Add(puppy2); 
result.Animals.Add(kitty1); 
result.Animals.Add(kitty2); 

string serializedResult = XmlSerializeHelper<ListOfAnimals>.Serialize(result); 
Questions connexes