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

我可以序列化可序列化对象的一般列表,而无需指定它们的类型。


类似于以下破损代码背后的意图:


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.


抱歉,缺少详细信息,但是我是一位初学者,不知道需要什么详细信息。如果人们要求更多细节,而试图以某种方式让我理解需要的细节或概述可能指示的基本答案,那将很有帮助。


也要感谢到目前为止我得到的两个答案-如果不理解这些主意,我本可以花更多的时间阅读。人们在此站点上的帮助程度令人惊讶。


qq_遁去的一_1
浏览 493回答 3
3回答

慕尼黑5688855

如果不指定期望的类型,则无法序列化对象的集合。您必须将期望类型的列表传递给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)){&nbsp; &nbsp; xs.Serialize(streamWriter, list);}如果列表中的所有对象都从同一类继承,则还可以使用XmlInclude属性指定所需的类型:[XmlInclude(typeof(Foo)), XmlInclude(typeof(Bar))]public class MyBaseClass{}
打开App,查看更多内容
随时随地看视频慕课网APP