如何序列化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
接口并手动实现序列化逻辑。