2013-10-02 6 views
1

Я давно считаю, что ваша модель домена не должна отвечать за сериализацию себя в XML. Я использовал интерфейс IXmlSerializable в прошлом, чтобы контролировать, как мои объекты сериализуются, но в идеале я предпочел бы, чтобы орехи и болты сериализации жили вне объекта.Неинтрузивные методы сериализации XML?

Однако я никогда не мог реализовать это в чистом виде, и мне было интересно, есть ли какие-либо шаблоны, которые я не замечал, чтобы это произошло. В принципе, я хочу, чтобы моя объектная модель делала это, и не обращала внимания на сериализацию XML (или любую другую сериализацию, если на то пошло), а затем передавала некоторую услугу, которая заманивает объект и сериализует его.

Я пробовал делать это с помощью методов расширения, но это не подходит, если вы хотите сериализовать коллекцию объектов типа. Я посмотрел на это с помощью оберток объектов и DTO, которые затем сериализуются, но тогда у вас есть накладные расходы на поддержание другого набора объектов и создание этих объектов, когда вы хотите сериализовать, что снова может стать беспорядочным, когда у вас есть коллекции типа.

Единственная вещь, которая использует отражение, но я буду беспокоиться об обработке накладных расходов.

Есть ли разумный способ сделать то, что я прошу, или мне просто укусить пулю и сделать мои объекты xml осведомленными?

+0

Если вы хотите производительность, XML не является для вас форматом. – Gusdor

ответ

1

Использование System.Xml.Serialization Атрибуты является, поместив гайки и болты вне вашего кода. Вы определяете метаданные и за исключением необязательных параметров, дополнительный код не требуется. Внедрение IXmlSerializable и выполнение сериализации вручную подвержено ошибкам, и его следует избегать. Зачем? Вы определяете свои данные 3 раза.

  1. XML Schema
  2. класса
  3. Сериализация код

Использование атрибутов, вы можете вычистить шаг 3.

XML и C# есть рассогласование импедансов. Нравится вам это или нет, в какой-то момент вам нужно будет определить сериализацию для создания правильной модели документа.

Возможно, классы, которые вы сериализуете, не должны выполнять какую-либо работу. Это всего лишь хранилище данных. Попробуйте абстрагировать свою логику от сериализованных объектов - это может дать вам более теплое чувство.

Update

Если вы действительно, действительно ненавидите атрибуты, попробуйте использовать шаблон адаптера для сериализации модели. Код XML будет находиться в отдельном классе или сборке, и вы можете работать с вашей моделью на разных носителях. Вы будете страдать от необходимости обновлять сериализацию отдельно при обновлении своей модели.

+0

Возможно, это всего лишь моя лихорадка, но я никогда не стремился украшать объекты атрибутами. Это уменьшает вашу кодовую базу (imho) и по-прежнему эффективно связывает вашу модель с вашей сериализацией, чего я пытаюсь избежать. – David

+0

@David Это было проблемой для вас в прошлом? Я изо всех сил пытаюсь понять обстоятельства, при которых привязка к схеме может вызвать проблемы. Вы беспокоитесь о версировании? – Gusdor

Смежные вопросы