Как я могу использовать интерфейс IEnumerable и в то же время сделать так, чтобы XMLSerializer не использовал GetEnumerator()?

У меня есть класс, который анализирует очень большой файл (который не помещается в памяти), и в настоящее время я использую интерфейс IEnumerable для использования foreach, поэтому я могу легко получить проанализированное содержимое файла построчно. В настоящее время я пытаюсь записать это в файл с помощью XMLSerializer. Он настаивает на перечислении класса, и в моем случае это означает выгрузку большого проанализированного содержимого файлов в XML. Есть ли способ (хакерский или элегантный) использовать этот интерфейс и при этом получить «ожидаемую» функциональность из XMLSerializer?

(Я называю это «ожидаемым» только потому, что это кажется ожидаемым результатом, если бы я реализовал какой-то интерфейс коллекции, а не IEnumerable. Возможно, мои концепции IEnumerable и коллекций не в порядке. :()


person llamaoo7    schedule 17.12.2008    source источник


Ответы (3)


Что ж, вы можете реализовать IXmlSerializable и получить полный контроль. Не совсем понятно (без псевдокода) что за настройка - иногда [XmlIgnore] может помочь, но в данном случае я не уверен без примера что у вас есть, и что вы делаете/не хотите.

person Marc Gravell    schedule 17.12.2008

Мне удалось решить эту проблему, не меняя дизайн. Ни один из моих кодов не полагался на интерфейс IEnumerable, только на реализацию IEnumerable GetEnumerator() (очевидно, foreach не проверяет, реализован ли IEnumerable). Простое закомментирование интерфейса в объявлении класса помогло.

person llamaoo7    schedule 19.12.2008
comment
Блестящее решение. У меня была такая же проблема, когда мне нужны были только счетчики для удобства. Отказавшись от реализации интерфейса (но по-прежнему предоставляя свои перечислители), моя сериализация снова работает, и я все еще могу использовать foreach. - person Chris; 08.01.2010

Мне кажется, что вашу проблему можно решить, используя более жесткую инкапсуляцию.

Звучит так, как будто вы используете один и тот же класс для загрузки данных из файла и для хранения представления этих данных в памяти. Если это так, вы можете (и, возможно, должны) переместить эту функциональность в два класса. Затем только сериализуйте класс «в памяти».

person andypaxo    schedule 17.12.2008