Имея DataContractSerializer сериализовать один и тот же класс двумя разными способами? - PullRequest
2 голосов
/ 05 мая 2009

Я использую DataContractSerializer для сериализации свойств объектов и полей, помеченных атрибутами DataMember, в xml.

Теперь есть другой вариант использования для того же класса, где мне нужно сериализовать другие свойства и другие поля.

Есть ли способ добавить «еще один DataMemberAttribute», который можно использовать для моего другого сценария сериализации?

Ответы [ 3 ]

2 голосов
/ 05 мая 2009

Нет, в основном.

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

Параметры, если вы пишете свой собственный код сериализации:

  • объявляет ваши собственные атрибуты [DataMember] -стилей и интерпретирует их во время выполнения в вашем собственном коде сериализации
  • использовать "класс приятелей"
  • использовать внешние метаданные (например, файл)
  • использовать конфигурацию на основе кода (т.е. через DSL)

На самом деле, я ожидаю, что первым будет самый простой выбор.

1 голос
/ 07 мая 2009

В аналогичном сценарии в прошлом мы использовали объектно-ориентированный подход и создали новый класс, который расширяется от основного класса. Чтобы помочь вам достичь наследования с помощью DataContractSerializer, проверьте KnownTypeAttribute

В одном из ваших комментариев к вашему вопросу,

Если один и тот же класс реализует несколько интерфейсов, определенные элементы данных могут относиться только к одному из интерфейсов.

Если это так в вашем сценарии, то, возможно, ваши контракты на обслуживание данных должны раскрывать только интерфейсы, а не класс?

Например, если у вас есть такой класс:

[DataContract]
public class DataObject : IRed, IBlue

тогда вместо того, чтобы ваш операционный контракт раскрыл DataObject, у вас есть два операционных контракта, один для IRed и один для IBlue. Это устраняет необходимость в настраиваемом коде сериализации.

0 голосов
/ 07 мая 2009

Есть способ сделать это, но это безобразный хак.

DataContractSerializer может сериализовать объекты, которые реализуют интерфейс IXmlSerializable. Вы можете реализовать интерфейс и создать свои собственные методы ReadXml(XmlReader reader) и WriteXml(XmlWriter writer), которые могут сериализовать объект различными способами.

Обратите внимание, что для определения способа сериализации объекта вам необходимо встроить флаг в сам класс. (Невозможно указать DataContractSerializer, какой режим использовать, поэтому флаг должен содержаться в самом объекте.)

Вторая версия класса DTO, как предполагает @Marc, будет намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...