Как / почему XmlSerializer обрабатывает класс по-разному, когда он реализует IList <T>?

XmlSerializer звонитIList<T>.Add() в моем классе, и я не понимаю, почему.

У меня есть собственный класс (один из нескольких классов в иерархии), содержащий данные, которые я преобразую в и из XML, используяXmlSerializer, В предыдущей версии моего кода эти классы не реализовывали никаких интерфейсов, и сериализация XML и десериализация, казалось, работали как ожидалось.

Сейчас я работаю над другим кодом, который использует данные, содержащиеся в этом классе, и я подумал, что было бы полезно, если бы я мог получить доступ к данным черезIList<T> интерфейс, поэтому я изменил свой класс для реализации этого интерфейса. (Буква «T» в данном случае является еще одним из моих пользовательских классов.) Это не подразумевало добавление каких-либо новых полей в класс; Я реализовал всенеобходимые методы и свойства с точки зрения данных, которые уже были сохранены.

Я надеялся, что это никак не повлияет на сериализацию. Однако при десериализации данных XML в мой класс что-то теперь вызывает новыйAdd() метод, который я реализовал как частьIList<T> интерфейс (который является проблемой, потому что этот конкретный списокIsReadOnly так чтоAdd() бросаетNotSupportedException).

Это происходит даже тогда, когда узел XML для моего класса просто<myClass/> без каких-либо атрибутов XML или потомков;XmlSerializer по-видимому, все еще создает новыйmyOtherClass (который нигде не указан в документе XML) и пытаетсяAdd() это кmyClass.

У меня проблемы с поиском информации в этом, потому что большинство вопросов, связанных сXmlSerializer а такжеIList<T> похоже, вовлекают людей, пытающихся сериализовать / десериализовать переменную типаIList<T>, Это НЕ моя ситуация; У меня нет переменных типаIList<T> в любом месте кода. Мой класс сериализуется и десериализируется очень хорошо, если я НЕ реализуюIList<T> интерфейс.

Может кто-нибудь объяснить мне, почемуXmlSerializer звонитIList<T>.Add() на моем уроке и / или как его остановить?

В идеале предложения должны быть совместимы с этим кодом, который в конечном итоге будет работать внутри Unity3d (.NET 2.0).

Ответы на вопрос(2)

Ваш ответ на вопрос