Подтвердить что ты не робот

Как сериализовать интерфейс, такой как IList <T>

Возможный дубликат:
Как сериализовать IList <T> ?

Я хочу сериализовать класс (пусть его называют S), который содержит свойство типа IList<T>, где T - это другой класс, который я определил. Я получаю исключение, когда пытаюсь сериализовать экземпляр класса S в XML. Это понятно, поскольку XmlSerializer не знает, какой конкретный класс использовать. Есть ли способ, надеюсь, использовать атрибуты, чтобы указать, какой конкретный класс необходимо создать при сериализации/десериализации экземпляра. Моя реализация класса S создает экземпляр класса List<T>. Вот несколько примеров, иллюстрирующих мой пример:

using System;
using System.Xml.Serialization;
using System.IO;

[Serializable]
public class T { }

[Serializable]
public class S
{
    public IList<T> ListOfTs { get; set; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}

public class Program
{
    public void Main()
    {
        S s = new S();
        s.ListOfTs.Add(new T());
        s.ListOfTs.Add(new T());
        XmlSerializer serializer = new XmlSerializer(typeof(S));
        serializer.Serialize(new StringWriter(), s);
    }
}

Я надеюсь, что есть атрибут, который я могу разместить над определением ListOfTs, которое говорит сериализации, "предположите экземпляр List<T> при сериализации/десериализации".

4b9b3361

Ответ 1

Измените

public IList<T> ListOfTs { get; set; }

к

public List<T> ListOfTs { get; set; }

Тогда он будет работать.

Ответ 2

Я думаю, что есть два способа, к которым обычно подходят такие проблемы.

Можно было бы использовать DataContractSerializer, но поскольку вы уже используете XmlSerializer, вы, вероятно, не хотите этого делать.

"Альтернативный" должен иметь свойство, которое используется специально для сериализации, и игнорировать IList во время сериализации.

[Serializable]
public class S
{
    IList<T> _listofTs;

    [XmlIgnore]
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; }

    [XmlElement(Name="Not Exactly the Greatest Solution!")]
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}

Ответ 3

Вы можете реализовать интерфейс IXmlSerializable и реализовать логику сериализации вручную с помощью Xml-читателей и писателей.