DataContractSerializer: Как сериализовать классы / члены без атрибутов DataContract / DataMember

datacontractserializer efpocoadapter entity-framework serialization

Вопрос

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

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

От Алексея:

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

Принятый ответ

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

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

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

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

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

Марк


Популярные ответы

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



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow