Почему XmlSerializer требует, чтобы типы, которые наследуются от IEnumerable, имели реализацию Add (System.Object)? - PullRequest
8 голосов
/ 02 марта 2011

Я использую сериализацию xml, но теперь столкнулся с ошибкой во время выполнения, которую я не видел раньше.

"Для XML-сериализации, типы которых наследовать от IEnumerable должен иметь реализация Add (System.Object) на всех уровнях их наследования иерархия. ImageEditor.EffectOptions не реализует Add (System.Object) "

Кажется немного странным, что вынужден реализовывать метод через исключение времени выполнения, а не из-за ошибки времени компиляции, такой как отсутствующие методы из реализованных интерфейсов.

Это задумано? Разве это не должно выполняться через какой-то интерфейс, такой как XmlSerializable и т. Д.

Кроме этого мне интересно, гарантирует ли сериализатор передачу значения правильного типа, где я могу просто привести его к типу, который в моем случае равен EffectOption.

Или я должен реализовать этот метод Add (object), чтобы увидеть, имеет ли объект тип EffectOption и, если нет, выдать исключение?

Я не реализовывал этот метод Add (object) ранее, но, по-моему, безопаснее просто привести его к EffectOption и добавить в EffectOptions коллекцию.

РЕДАКТИРОВАТЬ: Вот сам тип:

public class EffectOptions : IEnumerable<EffectOption>
{
    public List<EffectOption> Options { get; private set; }

    //IEnumerable methods
}

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Поскольку подклассы неявно реализуют методы интерфейса из-за базового класса, но xmlserializer использует отражение, и поэтому вы получаете ошибку во время выполнения, а не во время компиляции.

Попробуйте явно реализовать и посмотреть, что произойдет. У меня не было этой проблемы раньше, поэтому я не уверен, почему вы, если вы делаете что-то нестандартное.

Если ваши подклассы явно реализуют интерфейс, но не выполняют какой-либо код реализации (позволяющий неявной реализации методов произойти), тогда удалите интерфейс из объявления вашего подтипа, так как он все еще должен быть действительным из-за вашего базового типа. (кто-то скажи мне, если я здесь)

2 голосов
/ 23 мая 2011

Я только что столкнулся с этой проблемой и решил ее, добавив метод add:

public class EffectOptions : IEnumerable<EffectOption>
{
    public List<EffectOption> Options { get; private set; }

    public void Add(object o){
        this.Options.Add(o as EffectOption); //you may want to extend the code to check that this cast can be made,
                                             //and throw an appropriate error (otherwise it'll add null to your list)
    }

    //IEnumerable methods
}

Надеюсь, это поможет.

...