【问题标题】:XmlSerialization of List of mixed type objects in c#C#中混合类型对象列表的Xml序列化
【发布时间】:2014-07-19 08:35:21
【问题描述】:

我想序列化 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&lt;CustomeClass&gt; 时它可以工作,但我需要它是List&lt;object&gt;。 感谢您的帮助

【问题讨论】:

  • [Serializable] 用于不同的序列化程序,在这里没有任何用处。
  • 如“不管有没有它都不起作用”?
  • 我删除了[Serializable],所以它还不能工作。
  • 为什么需要它成为List&lt;object&gt;?你打算把所有种类的对象都放在那个列表中吗?也许您应该考虑更好地组织数据...
  • 因为我正在编写一个动态代码,我不知道最终用户会选择哪种类型。

标签: c# xml serialization arraylist xmlserializer


【解决方案1】:

虽然我绝对建议不要使用这种代码,但您可以使用XmlSerializer 构造函数重载,它接受Type[] 的其他类型。来自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 接口
  • 如果答案有帮助,请考虑将其标记为答案。您可以通过单击左侧投票按钮下方的绿色复选标记来做到这一点
  • 再次感谢您的帮助。我将其标记为答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多