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

C#:包含泛型列表的类的XML序列化,c#,generics,xmlserializer,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>()}; X

我想知道是否有任何方法可以将包含泛型列表的类序列化为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
{
}
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
{
}
类程序
{
静态void Main(字符串[]参数)
{
var o=新的容器类();
o、 值=新列表{new SomeClass(),new SomeClass()};
XmlSerializer xs=新的XmlSerializer(typeof(ContainerClass));
MemoryStream buffer=新的MemoryStream();
使用(TextWriter=新的StreamWriter(缓冲区))
{
Serialize(writer,o);//此处为InvalidOperationException
}
var xml=Encoding.UTF8.GetString(buffer.ToArray());
}
}
公共类集装箱类
{
公共列表值{get;set;}
}
公共类
{
}
公共类SomeClass:SomeClass
{
}
我知道有一种方法可以将额外的类型传递给序列化程序,但是现在没有办法将可能出现的所有组合都传递给序列化程序

我曾尝试以各种方式实现IXmlSerializable I,但没有成功

你知道怎么处理吗


如果有任何外部库可以处理它,我也愿意使用它。

我找到了做这项工作的方法。

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


在binaries文件夹下获取dll并将其添加到项目中。那么您的代码应该是这样工作的:

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
{
}
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
{
}
类程序
{
静态void Main(字符串[]参数)
{
var o=新的容器类();
o、 值=新列表{new SomeClass(),new SomeClass()};
var xml=Atlas.xml.Serializer.Serialize(o,true);
}
}
公共类集装箱类
{
公共列表值{get;set;}
}
公共类
{
}
公共类SomeClass:SomeClass
{
}
输出与此类似:

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


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

我想知道在IXMLSerializable上设置通用约束是否有效。例如
公共类SomeClass:SomeClass,其中T:IXMLSerializable…
(并确保所有内容都是可序列化的。)没有区别。但在我看来,“另一个用于.NET框架的XML序列化库”完成了这项工作。