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

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

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

Ответы [ 3 ]

3 голосов
/ 17 декабря 2008

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

2 голосов
/ 19 декабря 2008

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

0 голосов
/ 17 декабря 2008

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

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

...