我可以序列化可序列化对象的一般列表,而无需指定它们的类型。类似于以下破损代码背后的意图:List<ISerializable> serializableList = new List<ISerializable>();XmlSerializer xmlSerializer = new XmlSerializer(serializableList.GetType());serializableList.Add((ISerializable)PersonList);using (StreamWriter streamWriter = System.IO.File.CreateText(fileName)){ xmlSerializer.Serialize(streamWriter, serializableList);}编辑:对于那些想了解细节的人:当我尝试运行此代码时,它在XMLSerializer [...]行上的错误如下:无法序列化接口System.Runtime.Serialization.ISerializable。如果我改变了List<object>我会得到"There was an error generating the XML document."。InnerException详细信息是"{"The type System.Collections.Generic.List1[[Project1.Person, ConsoleFramework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] may not be used in this context."}"人员对象定义如下:[XmlRoot("Person")]public class Person{ string _firstName = String.Empty; string _lastName = String.Empty; private Person() { } public Person(string lastName, string firstName) { _lastName = lastName; _firstName = firstName; } [XmlAttribute(DataType = "string", AttributeName = "LastName")] public string LastName { get { return _lastName; } set { _lastName = value; } } [XmlAttribute(DataType = "string", AttributeName = "FirstName")] public string FirstName { get { return _firstName; } set { _firstName = value; } }}PersonList只是一个List<Person>。不过,这只是用于测试,因此并不认为细节太重要。关键是我有一个或多个不同的对象,所有这些对象都是可序列化的。我想将它们全部序列化为一个文件。我认为最简单的方法是将它们放在通用列表中,然后一次性序列化列表。但这是行不通的。我也尝试过List<IXmlSerializable>,但是失败了System.Xml.Serialization.IXmlSerializable cannot be serialized because it does not have a parameterless constructor.抱歉,缺少详细信息,但是我是一位初学者,不知道需要什么详细信息。如果人们要求更多细节,而试图以某种方式让我理解需要的细节或概述可能指示的基本答案,那将很有帮助。也要感谢到目前为止我得到的两个答案-如果不理解这些主意,我本可以花更多的时间阅读。人们在此站点上的帮助程度令人惊讶。
3 回答
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
如果不指定期望的类型,则无法序列化对象的集合。您必须将期望类型的列表传递给XmlSerializer(extraTypes参数)的构造函数:
List<object> list = new List<object>();
list.Add(new Foo());
list.Add(new Bar());
XmlSerializer xs = new XmlSerializer(typeof(object), new Type[] {typeof(Foo), typeof(Bar)});
using (StreamWriter streamWriter = System.IO.File.CreateText(fileName))
{
xs.Serialize(streamWriter, list);
}
如果列表中的所有对象都从同一类继承,则还可以使用XmlInclude属性指定所需的类型:
[XmlInclude(typeof(Foo)), XmlInclude(typeof(Bar))]
public class MyBaseClass
{
}
- 3 回答
- 0 关注
- 484 浏览
添加回答
举报
0/150
提交
取消