如何序列化IList 等接口

可能重复:
如何序列化IList ?

我希望序列化一个类(我们称之为S ),它包含IList类型的属性,其中T是我定义的另一个类。 当我尝试将类S的实例序列化为XML时,我得到一个exception。 这是可以理解的,因为XmlSerializer不知道使用哪个具体类。 是否有一种方法,希望使用属性,指定在序列化/反序列化实例时要实例化的具体类。 我的类S实现创建了List类的实例。 这是一些代码来说明我的例子:

 using System; using System.Xml.Serialization; using System.IO; [Serializable] public class T { } [Serializable] public class S { public IList ListOfTs { get; set; } public S() { ListOfTs = new List(); } } public class Program { public void Main() { S s = new S(); s.ListOfTs.Add(new T()); s.ListOfTs.Add(new T()); XmlSerializer serializer = new XmlSerializer(typeof(S)); serializer.Serialize(new StringWriter(), s); } } 

我希望有一个属性可以放在ListOfTs定义之上,对序列化说,“在序列化/反序列化时假设List的实例”。

改变

 public IList ListOfTs { get; set; } 

 public List ListOfTs { get; set; } 

然后它会工作。

我认为有两种方法可以解决这类问题。

一种是使用DataContractSerializer ,但由于你已经在使用XmlSerializer,你可能不想这样做。

“替代”是具有专门用于序列化的属性,并在序列化期间忽略IList。

 [Serializable] public class S { IList _listofTs; [XmlIgnore] public IList ListOfTs { get _listofTs; set _listofTs = value; } [XmlElement(Name="Not Exactly the Greatest Solution!")] public List ListOfTs { get _listofTs; set _listofTs = value; } public S() { ListOfTs = new List(); } } 

您可以使用Xml读取器和编写器实现IXmlSerializable接口并手动实现序列化逻辑。