Как / почему 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).