我想创建一个序列化不同子项列表的方法。每个孩子都有自己的XML文件。对单个对象执行此操作非常简单:
接口ISerializable { }
public class Item : ISerializable { public string name { get; set; } public int number { get; set; } } public class Weapon : ISerializable { public string name { get; set; } public int damage {get; set;} }
public static void SerializeToXML(ISerializable child)
{
XmlSerializer serializer = new XmlSerializer(child.GetType());
using (TextWriter textWriter = new StreamWriter("test.xml"))
{
serializer.Serialize(textWriter, child);
}
}
我可以将从ISerializable
派生的任何内容放入serialize方法中以获得所需的结果。但是,当给List<ISerializable>
作为可能的参数时,它不会编译Cannot convert List<item> to List<ISerializable>
。无论如何要解决这个问题?
public static void SerializeListToXML(List<ISerializable> listToXML)
{
XmlSerializer serializer = new XmlSerializer(listToXML.GetType());
using (TextWriter textWriter = new StreamWriter("test.xml"))
{
serializer.Serialize(textWriter, listToXML);
}
}
我这样做的基本原因是获取更大结构的XML模板,因此我手动添加XML以加载到我的程序中。我想我会先从创建一个序列化程序中受益,所以我有一个正确的XML结构。也许这可以在以后保存用户数据的过程中派上用场。
答案 0 :(得分:1)
SerializeListToXML
应该使用IEnumerable<ISerializable>
代替List<Item>
。
List<Item>
无法投放到List<ISerializable>
。如果可以,那么您可以将任何ISerializable
添加到列表中,而不仅仅是项目。使用IEnumerable<>
,您无法修改集合 - 仅对其进行迭代。由于SerializeListToXML
不需要修改集合,因此它可以接受IEnumerable<ISerializable>
,这种限制较少。请参阅以下部分以及关于协方差和逆变的子部分:Covariance and Contravariance