Сериализация списков с унаследованными типами - PullRequest
2 голосов
/ 06 апреля 2011

Я сейчас работаю с сериализацией в C # и столкнулся с проблемой, на которую не могу найти ответ.Таким образом, у меня есть сериализуемый класс со списком другого сериализуемого класса в качестве свойства.Мне нужен был один из элементов в списке, чтобы иметь отдельное свойство, поэтому я создал подкласс и добавил его в список, как и раньше.Именно тогда возникли проблемы с сериализацией, поэтому я могу только представить, что списки не могут быть сериализованы с унаследованными классами в них, но почему?И как будет достигнут подобный конец?В любом случае, вот пример того, что я пытаюсь сделать:

[Serializable]
public class aList
{
    [XmlElement]public List<b> list = new List<b>();

    public aList()
    {
        list.Add(new b());
        list.Add(new b());
        list.Add(new c());
    }
}

[Serializable]
public class b
{
    [XmlElement]public int prop1;
    [XmlElement]public string prop2;

    public b()
    {
        prop1 = 0;
        prop2 = String.Empty;
    }
}

[Serializable]
public class c : b
{
    [XmlElement]public bool prop3;

    public c() : base()
    {
        prop3 = false;
    }
}

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

XmlInclude атрибуты.Они вроде ... неуравновешенные.По сути, вы даете атрибуты своим классам, которые дают подсказки сериализатору о вашем наследовании.

В частности:

[Serializable]
[XmlInclude(typeof(c))]
public class b
{
    [XmlElement]
    public int prop1;

    [XmlElement]
    public string prop2;

    public b()
    {
        prop1 = 0;
        prop2 = String.Empty;
    }
}
0 голосов
/ 06 апреля 2011

Может быть попробовать использовать массив вместо списка.Массив сериализуем, если элемент, который он содержит, сериализуем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...