Когда использовать атрибуты DataContract и DataMember?


179

Я очень озадачен DataContractатрибутом в WCF. Насколько мне известно, он используется для сериализации определенного пользователем типа, как классы. Я написал один класс, который выставляется на стороне клиента, как это.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

Это работает правильно, но когда я удаляю, DataContractи DataMemberэто также работает должным образом. Я не могу понять, почему это работает правильно. Может кто-нибудь сказать мне, что на самом деле используется DataContract?

Мой сервисный контракт выглядит так

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}

Идеальный ответ здесь stackoverflow.com/questions/5681842/…
Асиф Икбал

Ответы:


361

Поскольку многие программисты были перегружены с [DataContract]и [DataMember]атрибутами, с .NET 3.5 SP1, Microsoft сделала контракт данных сериализатора обрабатывать все классы - даже без какого - либо из этих атрибутов - так же, как старый XML сериализатор.

Таким образом, начиная с .NET 3.5 с пакетом обновления 1 (SP1), вам больше не нужно добавлять атрибуты контракта данных или членов-данных - если вы этого не сделаете, сериализатор контракта данных будет сериализовать все общедоступные свойства вашего класса, как это сделал бы сериализатор XML.

ОДНАКО: не добавляя эти атрибуты, вы теряете много полезных возможностей:

  • без [DataContract], вы не можете определить пространство имен XML для ваших данных, чтобы жить в
  • без [DataMember], вы не можете сериализовать непубличные свойства или поля
  • без [DataMember], вы не можете определить порядок сериализации ( Order=) и DCS будет сериализовать все свойства в алфавитном порядке
  • без [DataMember], вы не можете определить другое имя для вашей собственности ( Name=)
  • без [DataMember], вы не можете определить такие вещи, как IsRequired=или другие полезные атрибуты
  • без [DataMember]этого вы не можете пропустить определенные общедоступные свойства - все общедоступные свойства будут сериализованы DCS

Таким образом , для решения «quick'n'dirty», оставляя прочь [DataContract]и [DataMember]атрибуты будут работать - но это все еще хорошая идея , чтобы иметь их на ваших классов данных - только , чтобы быть более четко о том, что вы делаете, и дать себе доступ ко всем тем дополнительным функциям, которые вы не получите без них ...


Вы подразумеваете, что по умолчанию все типы данных внутренне помечены как сериализуемые, и мы использовали DataContract / DataMember, чтобы ограничить их.
Сантош Сингх

2
@Santosh: если у вас есть класс с некоторыми общедоступными свойствами, он будет сериализован сериализатором контрактов данных WCF, если вы явно не примените [DataContract] / [DataMember] .- тогда вы на 100% можете сказать, что сериализуется и что нет
marc_s

36
@Arthis: это не совсем так. По состоянию на .NET 3.5 SP1, WCF будет счастливо сериализации классов без какой - либо [DataContract] и [DataMember]атрибутов ... но как только вы начнете использовать один из этих атрибутов, то такое поведение « по умолчанию» перестанет работать - как только у вас есть единственный [DataMember] в вашем class, с этого момента, только те свойства с этим атрибутом будут сериализованы.
marc_s

4
Oohh! Спасибо за разъяснение этого вопроса! Я буду копать это немного дальше!
Артис

6
Youhou! это круто!! Merci Beaucoup!
Артис

16

С точки зрения WCF, мы можем общаться с сервером и клиентом через сообщения. Для передачи сообщений и с точки зрения безопасности нам необходимо создать данные / сообщения в сериализованном формате.

Для сериализации данных мы используем атрибуты [datacontract] и [datamember]. В вашем случае, если вы используете datacontractWCF, используется DataContractSerializerеще WCF, XmlSerializerкоторый является методом сериализации по умолчанию.

Позвольте мне объяснить подробно:

в основном WCF поддерживает 3 типа сериализации:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - Порядок по умолчанию такой же, как класс

DataContractSerializer / NetDataContractSerializer : - Порядок по умолчанию - алфавитный

XmlSerializer : - XML-схема обширна

DataContractSerializer / NetDataContractSerializer : - XML-схема ограничена

XmlSerializer : - поддержка версий невозможна

DataContractSerializer / NetDataContractSerializer : - Возможна поддержка версий

XmlSerializer : - Совместимость с ASMX

DataContractSerializer / NetDataContractSerializer : - Совместимость с .NET Remoting

XmlSerializer : - Атрибут не требуется в XmlSerializer

DataContractSerializer / NetDataContractSerializer : - Атрибут, необходимый для этой сериализации

так что вы используете, зависит от ваших требований ...


8

Контракт данных - это формальное соглашение между службой и клиентом, которое абстрактно описывает данные, подлежащие обмену. То есть для связи клиент и служба не должны совместно использовать одни и те же типы, только одни и те же контракты данных. Контракт данных точно определяет, для каждого параметра или типа возврата, какие данные сериализуются (превращаются в XML) для обмена.

Windows Communication Foundation (WCF) по умолчанию использует механизм сериализации, называемый сериализатором контрактов данных, для сериализации и десериализации данных (преобразования их в XML и из XML). Все примитивные типы .NET Framework, такие как целые числа и строки, а также некоторые типы, рассматриваемые как примитивы, такие как DateTime и XmlElement, могут быть сериализованы без какой-либо другой подготовки и считаются имеющими контракты данных по умолчанию. Многие типы .NET Framework также имеют существующие контракты данных.

Вы можете найти полную статью здесь.


2
Это все верно и хорошо, но на самом деле это не отвечает на вопрос OP о том, почему сериализатор контрактов данных также работает без каких-либо атрибутов [DataContract] и [DataMember] в ваших классах ....
marc_s

Может кто-нибудь сказать мне, что на самом деле используется DataContract? - Я думаю , что по крайней мере часть вопроса будет ответила.
IAbstract

2

Контракт данных - это формальное соглашение между службой и клиентом, которое абстрактно описывает данные, подлежащие обмену.

Данные контракта могут быть явными или неявными. Простой тип, такой как int, string и т. Д., Имеет неявный контракт данных. Пользовательский объект является явным или сложным типом, для которого вы должны определить контракт данных, используя атрибуты [DataContract] и [DataMember].

Контракт данных может быть определен следующим образом:

  • Он описывает внешний формат данных, передаваемых в и из сервисных операций

  • Он определяет структуру и типы данных, которыми обмениваются служебные сообщения.

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

Нам нужно включить ссылку System.Runtime.Serialization на проект. Эта сборка содержит атрибуты DataContract и DataMember.


2
  1. Контракт данных: он указывает, что ваш класс сущностей готов к процессу сериализации.

  2. Элементы данных. Указывает, что конкретное поле является частью контракта данных и может быть сериализовано.


0

Также, когда вы звоните с http-запроса, он будет работать правильно, но когда вы попытаетесь позвонить из net.tcp, вы получите все это


0

Атрибут DataMember необязательно добавлять для сериализации данных. Когда атрибут DataMember не добавляется, старый XMLSerializer сериализует данные. Добавление DataMember предоставляет полезные свойства, такие как order, name, isrequired, которые нельзя использовать иначе.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.