2011-11-08 58 views
0

我有两个类,其中一个是从另一个继承的。XmlSerializer自定义序列化

例如Animal这是一个基类,Dog是一个继承类。

我填充了一个List集合,我想将它序列化为List集合。

可能吗?

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

Where result is a List<Dog> collection. 

而且XmlSerializeHelper实现如下:

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

回答

0

如果你有一个列表(我通常使用这个数组列表),添加XML属性给它的所有派生类

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

这告诉该类型是可以期待的串行...

...编辑... 为了使其更具可读性,可以这样考虑:

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

然后调用这样的序列:

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