c#中混合类型对象列表的XmlSerialization

本文关键字:列表 XmlSerialization 对象 类型 混合 | 更新日期: 2023-09-27 18:13:50

我想序列化List<object>包含我写的特定类。

public static void Main(string[] args)
{
        List<object> ListToSerialize = new List<object>();
        ListToSerialize.Add(new CustomeClass());
        ListToSerialize.Add("");
        ListToSerialize.Add(2);
        ListToSerialize.Add(new int[] { 7, 8, 6 });
        XmlSerializer xmlSerializer = new XmlSerializer(ListToSerialize.GetType());
        StringWriter stringWriter = new StringWriter();
        using (var xmlWriter = XmlWriter.Create(stringWriter))
        {
            xmlSerializer.Serialize(xmlWriter, ListToSerialize);
        }
        string Res = stringWriter.ToString();
}
[Serializable]
public class CustomeClass 
{
}

i got error:生成XML文档时出错。类型New。CustomeClass没有被期望。使用XmlInclude或SoapInclude属性来指定静态未知的类型。

还实现了IXmlSerializable接口。

[Serializable]
public class CustomeClass : IXmlSerializable
{
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw null;
    }
    public void ReadXml(System.Xml.XmlReader reader)
    {
    }
    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteString("1");
    }
}

and I got bellow error:

类型为New。CustomeClass不能在这个上下文中使用。使用New。CustomeClass作为类或结构的参数、返回类型或成员时,参数、返回类型或成员必须声明为New类型。CustomeClass(它不能是对象)。类型为New的对象。CustomeClass不能用于无类型集合,如ArrayLists。

它的工作,当我使用List<CustomeClass>,但我需要它是List<object>。谢谢你的帮助

c#中混合类型对象列表的XmlSerialization

虽然我绝对建议不要使用这种代码,但您可以使用XmlSerializer构造函数重载,它接受其他类型的Type[]。From XmlSerializer Constructor:

初始化XmlSerializer类的一个新实例将指定类型的对象序列化为XML文档将XML文档反序列化为指定类型的对象。如果一个属性或字段返回一个数组,extraTypes参数指定可插入到数组中的对象。

像这样使用:

public static void Main(string[] args)
{
        List<object> ListToSerialize = new List<object>();
        ListToSerialize.Add(new CustomeClass());
        ListToSerialize.Add("");
        ListToSerialize.Add(2);
        ListToSerialize.Add(new int[] { 7, 8, 6 });
        XmlSerializer xmlSerializer = new XmlSerializer(ListToSerialize.GetType(), new[] 
        { typeof(int}, typeof(int[]), typeof(string), typeof(CustomeClass) });
        StringWriter stringWriter = new StringWriter();
        using (var xmlWriter = XmlWriter.Create(stringWriter))
        {
            xmlSerializer.Serialize(xmlWriter, ListToSerialize);
        }
        string Res = stringWriter.ToString();
}

如果删除IXmlSerializable接口,它可以工作。知道这个解决方案增加了时间复杂度是很有用的。