C#:包含泛型列表的类的XML序列化

时间:2011-11-04 15:07:20

标签: c# generics xmlserializer

我想知道是否有任何方法可以将包含泛型列表的类序列化为xml? 它看起来像这样:

class Program
{
    static void Main(string[] args)
    {
        var o = new ContainerClass();
        o.Values = new List<SomeClass> {new SomeClass<int>(), new SomeClass<long>()};

        XmlSerializer xs = new XmlSerializer(typeof(ContainerClass));
        MemoryStream buffer = new MemoryStream();
        using (TextWriter writer = new StreamWriter(buffer))
        {
            xs.Serialize(writer, o); // InvalidOperationException here
        }
        var xml = Encoding.UTF8.GetString(buffer.ToArray());
    }
}

public class ContainerClass
{
    public List<SomeClass> Values { get; set; }
}

public class SomeClass
{
}

public class SomeClass<T> : SomeClass
{
}

我知道有一种方法可以将额外的类型传递给序列化程序,但现在没有办法可能出现每种组合。

我试图以各种方式实现IXmlSerializable而没有成功。

知道怎么处理吗?

如果有任何可以处理它的外部库我也是开放的。

2 个答案:

答案 0 :(得分:1)

我找到了YAXLib来完成工作。

答案 1 :(得分:1)

尝试了几个库之后,我决定编写自己的代码:

Atlas Xml Serializer

在二进制文件夹下获取dll并将其添加到项目中。然后你的代码应该像这样工作:

class Program
{
    static void Main(string[] args)
    {
        var o = new ContainerClass();
        o.Values = new List<SomeClass> {new SomeClass<int>(), new SomeClass<long>()};

        var xml = Atlas.Xml.Serializer.Serialize(o, true);
    }
}

public class ContainerClass
{
    public List<SomeClass> Values { get; set; }
}

public class SomeClass
{
}

public class SomeClass<T> : SomeClass
{
}

输出类似于:

<ContainerClass>
    <Values>
        <item _type="WinformsTestApp.SomeClass`1[[System.Int32]], WinformsTestApp" />
        <item _type="WinformsTestApp.SomeClass`1[[System.Int64]], WinformsTestApp" />
    </Values>
</ContainerClass>

PS:WinformsTestApp是我的测试应用程序名称,因此它会更改以反映您的程序集名称。