C #: XML-сериализация класса, который содержит список обобщений - PullRequest
3 голосов
/ 04 ноября 2011

Интересно, есть ли способ сериализации в 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 I различными способами без успеха.

Есть идеи, как с этим бороться?

Я также открыт для внешних библиотек, если есть какие-либо, которые могут с этим справиться.

Ответы [ 2 ]

1 голос
/ 21 декабря 2015

Попробовав несколько библиотек, я решил написать свою собственную:

Сериализатор Atlas Xml

Получите dll под папкой binaries и добавьте ее в свой проект.Тогда ваш код должен работать следующим образом:

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 - это имя моего тестового приложения, поэтому оно изменится, чтобы отразить вашеНазвание сборки.

1 голос
/ 09 ноября 2011

Я нашел YAXLib , который делает эту работу.

...