Почему невозможно сериализовать в XML-файл интерфейс, подобный IList <T>? - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь сериализовать в XML-файл объект, который объявлен как ILIst, но это экземпляр List. Исключение говорит мне причину: вы не можете сериализовать интерфейс.

Это действительно необходимо в моем дизайне, или каким другим способом я должен сериализовать его?

Ответы [ 5 ]

2 голосов
/ 03 апреля 2012

Вы должны знать, какой конкретный тип создавать.

Сериализатор должен использовать метаданные, а не тип времени выполнения. Если бы вы знали только то, что ваш целевой объект должен был реализовать IList, что бы вы создали? Там не обязательно даже класс, который реализует его.

1 голос
/ 03 апреля 2012

Полагаю, причина, по которой вам нужно сохранить дизайн с IList , заключается в том, что это общий интерфейс с другим модулем.Одно из возможных решений:

Вместо:

    [XmlElement("Test")]
    public IList<String> Tests
    {
        get;
        set;
    }

Возможно, вы попробуете:

    [XmlElement("Test")]
    public List<String> TestList
    {
        get;
        set;
    }

    [XmlIgnore]
    public IList<String> Tests
    {
        get { return TestList; }
    }

Таким образом, вы сможете сохранить тот же интерфейс и в то же время воспользоваться преимуществамиФункция сериализации / десериализации в библиотеке .Net Xml.

1 голос
/ 03 апреля 2012

Это не должно быть проблемой, вы всегда можете использовать object.GetType (). Вот пример:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

class Program {
    static void Main(string[] args) {
        System.Collections.IList list = new List<int> { 1, 2, 3 };
        var ser = new XmlSerializer(list.GetType());
        ser.Serialize(Console.Out, list);
        Console.ReadLine();
    }
}
0 голосов
/ 03 апреля 2012

Вы не можете сериализовать интерфейс, потому что он не содержит никаких данных.Может быть, лучшее, что вы можете сделать, это реализовать ISerializable для самостоятельного управления сериализацией.

0 голосов
/ 03 апреля 2012

Я вижу два варианта:

  1. Вы можете привести его обратно к списку перед передачей его в сериализатор.Не идеально, но это сработает.
  2. Вы перебираете IList и сериализуете каждый элемент в один и тот же поток независимо.
...