cml中混合类型对象列表的Xml序列化

时间:2014-07-19 08:35:21

标签: c# xml serialization arraylist xmlserializer

我希望序列化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 
{
}

我收到了错误: 生成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");
    }
}

我得到了以下错误:

在此上下文中不能使用New.CustomeClass类型。要使用New.CustomeClass作为参数,返回类型或类或结构的成员,必须将参数,返回类型或成员声明为New.CustomeClass类型(它不能是对象)。 New.CustomeClass类型的对象不能用于未类型的集合,例如ArrayLists。

当我使用List<CustomeClass>时,它有效,但我需要List<object>。 谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

虽然我肯定建议不使用这种代码,但您可以使用XmlSerializer构造函数重载,它接受Type[]个其他类型。来自XmlSerializer Constructor

  

初始化可以的XmlSerializer类的新实例   将指定类型的对象序列化为XML文档,以及   将XML文档反序列化为指定类型的对象。如果一个   property或field返回一个数组,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();
}

答案 1 :(得分:0)

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