DataContractSerializer: Как сериализовать классы / члены без атрибутов DataContract / DataMember - PullRequest
9 голосов
/ 24 апреля 2009

DataContractSerializer требует, чтобы классы и члены были отмечены атрибутами DataContract и DataMember. Однако в моем случае классы создаются автоматически с помощью инфраструктуры EFPocoAdapater, и эти атрибуты отсутствуют.

Как я могу принудительно сериализовать все элементы, используя DataContractSerializer без этих атрибутов?

От Алексея:

Это изменилось в 3.5SP1, надеюсь, вы видели тот: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

Ответы [ 3 ]

6 голосов
/ 24 апреля 2009

Вы не можете - просто и понятно. Атрибут необходим DataContractSerializer для выбора элементов для сериализации. В контракте с XmlSerializer, который в основном просто сериализует все (если вы явно не указываете его игнорировать), DataContractSerializer является «opt-in» - вы должны явно указать ему (посредством атрибутов), какие поля и / или свойства сериализовать.

ОБНОВЛЕНИЕ: Как отметили несколько человек, в .NET 3.5 SP1 Microsoft немного ослабила эти правила - любое общедоступное свойство чтения / записи будет автоматически сериализовано DataContractSerializer. В то же время ваш класс также должен иметь конструктор по умолчанию без параметров - звучит как точные требования, которые мы предъявляли к XmlSerializer, когда ....

Конечно, это:

  • не позволяет вам сериализовать что-то частное - если вы хотите сериализовать это, вы должны выставить это как публичное свойство чтения / записи
  • не позволяет вам указать определенный выбранный порядок параметров - он будет использовать их только в том порядке, в котором они появляются в классе
  • теперь требует, чтобы у вас снова был конструктор без параметров в вашем классе для десериализации

Я все еще думаю, что эти вещи должны быть явными и понятными, поскольку необходимость в них больше не нужна, открывает путь для ленивого / небрежного программирования - мне это не нравится. Но если вы хотите, вы можете использовать его сейчас без явной пометки ваших свойств с помощью [DataMember] .....

Марк

0 голосов
/ 25 ноября 2009

Просто пометьте класс атрибутом [Serializable]. Любые участники, которым вы не хотите сериализовать, помечают [NonSerialized]. Обратите внимание, что [Serializable] вызывает сериализацию всех полей по умолчанию, где [DataContract] сериализовал поля по умолчанию без полей, кроме тех, которые отмечены [DataMember].

0 голосов
/ 30 апреля 2009

Я верю, что это возможно. Если вы реализуете интерфейс ISerializable, то сериализатор использует вашу реализацию вместо атрибутов. Хотя, думаю, вам все равно придется пометить класс [Serializable].

Это немного больше работы, чем добавление атрибутов, но это работает.

...