Я очень озадачен 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);
}
Ответы:
Поскольку многие программисты были перегружены с
[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]
атрибутов ... но как только вы начнете использовать один из этих атрибутов, то такое поведение « по умолчанию» перестанет работать - как только у вас есть единственный[DataMember]
в вашем class, с этого момента, только те свойства с этим атрибутом будут сериализованы.С точки зрения WCF, мы можем общаться с сервером и клиентом через сообщения. Для передачи сообщений и с точки зрения безопасности нам необходимо создать данные / сообщения в сериализованном формате.
Для сериализации данных мы используем атрибуты [datacontract] и [datamember]. В вашем случае, если вы используете
datacontract
WCF, используетсяDataContractSerializer
еще WCF,XmlSerializer
который является методом сериализации по умолчанию.Позвольте мне объяснить подробно:
в основном WCF поддерживает 3 типа сериализации:
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].
Контракт данных может быть определен следующим образом:
Он описывает внешний формат данных, передаваемых в и из сервисных операций
Он определяет структуру и типы данных, которыми обмениваются служебные сообщения.
Нам нужно включить ссылку System.Runtime.Serialization на проект. Эта сборка содержит атрибуты DataContract и DataMember.
источник
Контракт данных: он указывает, что ваш класс сущностей готов к процессу сериализации.
Элементы данных. Указывает, что конкретное поле является частью контракта данных и может быть сериализовано.
источник
Также, когда вы звоните с http-запроса, он будет работать правильно, но когда вы попытаетесь позвонить из net.tcp, вы получите все это
источник
Атрибут DataMember необязательно добавлять для сериализации данных. Когда атрибут DataMember не добавляется, старый XMLSerializer сериализует данные. Добавление DataMember предоставляет полезные свойства, такие как order, name, isrequired, которые нельзя использовать иначе.
источник