Когда использовать атрибуты DataContract и DataMember?
Я очень смущен 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);
}
8 ответов
Поскольку многие программисты были перегружены [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
Так что для "быстрого и грязного" решения, опуская [DataContract]
а также [DataMember]
Атрибуты будут работать - но все же хорошая идея, чтобы они были в ваших классах данных - просто чтобы быть более точным в том, что вы делаете, и дать себе доступ ко всем тем дополнительным функциям, которые вы не получите без них...,
С точки зрения WCF, мы можем общаться с сервером и клиентом через сообщения. Для передачи сообщений и с точки зрения безопасности нам необходимо сделать данные / сообщения в сериализованном формате.
Для сериализации данных мы используем атрибуты [datacontract] и [datamember]. В вашем случае, если вы используете datacontract
WCF использует DataContractSerializer
еще WCF использует XmlSerializer
который является методом сериализации по умолчанию.
Позвольте мне объяснить подробно:
в основном WCF поддерживает 3 типа сериализации:
- XmlSerializer
- DataContractSerializer
- NetDataContractSerializer
XmlSerializer: - Порядок по умолчанию такой же, как класс
DataContractSerializer / NetDataContractSerializer: - Порядок по умолчанию - алфавитный
XmlSerializer: - XML-схема обширна
DataContractSerializer / NetDataContractSerializer: - XML-схема ограничена
XmlSerializer: - поддержка версий невозможна
DataContractSerializer / NetDataContractSerializer: - Возможна поддержка версий
XmlSerializer: - Совместимость с ASMX
DataContractSerializer / NetDataContractSerializer: - Совместимость с.NET Remoting
XmlSerializer: - Атрибут не требуется в XmlSerializer
DataContractSerializer / NetDataContractSerializer: - Атрибут, необходимый для этой сериализации
так что вы используете, зависит от ваших требований...
Контракт данных - это формальное соглашение между службой и клиентом, которое абстрактно описывает данные, подлежащие обмену. То есть для связи клиент и служба не должны совместно использовать одни и те же типы, только одни и те же контракты на передачу данных. Контракт данных точно определяет для каждого параметра или типа возврата, какие данные сериализуются (превращаются в XML) для обмена.
Windows Communication Foundation (WCF) по умолчанию использует механизм сериализации, называемый сериализатором контрактов данных, для сериализации и десериализации данных (преобразования их в XML и из XML). Все примитивные типы.NET Framework, такие как целые числа и строки, а также некоторые типы, рассматриваемые как примитивы, такие как DateTime и XmlElement, могут быть сериализованы без какой-либо другой подготовки и считаются имеющими контракты данных по умолчанию. Многие типы.NET Framework также имеют существующие контракты данных.
Вы можете найти полную статью здесь.
Контракт данных: он указывает, что ваш класс сущностей готов к процессу сериализации.
Элементы данных. Указывает, что конкретное поле является частью контракта данных и может быть сериализовано.
Контракт данных - это формальное соглашение между службой и клиентом, которое абстрактно описывает данные, подлежащие обмену.
Данные контракта могут быть явными или неявными. Простой тип, такой как int, string и т. Д., Имеет неявный контракт данных. Пользовательский объект является явным или сложным типом, для которого вы должны определить контракт данных, используя атрибуты [DataContract] и [DataMember].
Контракт данных может быть определен следующим образом:
Он описывает внешний формат данных, передаваемых в и из сервисных операций
Он определяет структуру и типы данных, которыми обмениваются служебные сообщения.
- Он отображает тип CLR в XML-схему
- Он определяет, как типы данных сериализуются и десериализуются. Посредством сериализации вы преобразуете объект в последовательность байтов, которые могут передаваться по сети. Посредством десериализации вы повторно собираете объект из последовательности байтов, которые вы получаете от вызывающего приложения.
- Это система управления версиями, которая позволяет вам управлять изменениями в структурированных данных
Нам нужно включить ссылку System.Runtime.Serialization на проект. Эта сборка содержит атрибуты DataContract и DataMember.
Данные должны передаваться и обрабатываться внутри службы, и они хранят значения, поэтому в терминологии WCF они называются « Контрактом данных ».
Где каждый член Класса; т.е. контракт данных называется « Data Member », и они также должны быть украшены атрибутами.
Атрибут DataMember не обязательно добавлять для сериализации данных. Когда атрибут DataMember не добавляется, старый XMLSerializer сериализует данные. Добавление DataMember предоставляет полезные свойства, такие как order, name, isrequired, которые нельзя использовать иначе.
Также, когда вы звоните из http-запроса, он будет работать правильно, но когда вы попытаетесь позвонить из net.tcp, вы получите все эти вещи.