C # Advanced XML Serializer, который не требует загрязнения объекта домена - PullRequest
3 голосов
/ 29 октября 2009

Существуют ли какие-либо проекты с закрытым или открытым исходным кодом для сериализатора XML для C #, которые могут сериализовать по большей части любой объект без необходимости загрязнять объекты моего домена множеством атрибутов? Это также будет обрабатывать сериализацию коллекций, созданных с помощью внутренних обобщенных классов? Бонусом будет то, что он может обрабатывать сериализацию свойства типа интерфейса. Другим бонусом будет то, что он может сериализовать объекты, которые имеют свойства только для чтения (или, по крайней мере, с меткой доступа get, помеченной как внутренняя)

Ответы [ 2 ]

5 голосов
/ 29 октября 2009

Ну, сначала определите «продвинутый», то есть то, что конкретно вам нужно, что XmlSerializer не имеет. С точки зрения POCO, XmlSerializer имеет перегруженный ctor, который принимает все атрибуты, которые вы могли бы когда-либо добавить, чтобы избежать необходимости добавлять их в вашу объектную модель - но для этого все еще требуется открытый конструктор без параметров и работает только с открытыми полями / свойствами чтения / записи. И вам следует кэшировать / повторно использовать сериализатор, если вы используете этот подход.

Я не знаю ни о каких аналогичных альтернативах, просто потому, что в большинстве случаев это "достаточно хорошо" - и часто ошибочно пытаться грубо заставить свой существующий объект домена в DTO. Может быть проще и удобнее обслуживать простое сопоставление сущностей вашего домена с новым DTO, которому присваивается (и имеют соответствующий ctor / properties / etc).

Обратите внимание, что для проблемы ctor / properties у DataContractSerializer есть некоторые ответы, но это не так хорошо контролирует, как выглядит xml.

0 голосов
/ 29 октября 2009
  • Вы можете разрешить System.Xml.dll доступ к вашим внутренним объектам с помощью атрибута InternalsVisibleToAttribute. Таким образом, сериализация внутренних типов и / или внутренних членов. Включая внутренние .ctors.
  • Вы также можете реализовать IXmlSerializable для классов, чтобы настроить их сериализацию (например, контейнер, содержащий ссылки на интерфейсы).
  • Вам не нужно предоставлять атрибуты сериализации XML для ваших классов, а вместо этого предоставлять их как XmlAttributeOverrides.

XmlSerializer - почти всегда именно то, чего хотят люди, они просто не знают, насколько он гибок, как на самом деле.

...