为了账号安全,请及时绑定邮箱和手机立即绑定

XML可序列化可序列化对象的通用列表

XML可序列化可序列化对象的通用列表

C#
qq_遁去的一_1 2019-11-27 10:06:05
我可以序列化可序列化对象的一般列表,而无需指定它们的类型。类似于以下破损代码背后的意图: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

{

}


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 484 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信