Когда использовать атрибуты DataContract и DataMember? - PullRequest
166 голосов
/ 29 января 2011

Я очень озадачен атрибутом 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);      
}

Ответы [ 7 ]

336 голосов
/ 29 января 2011

Поскольку многие программисты были перегружены атрибутами [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] - но все равно хорошая идея, чтобы они были включенываши классы данных - просто чтобы быть более точным в том, что вы делаете, и дать себе доступ ко всем тем дополнительным функциям, которые вы не получите без них ...

13 голосов
/ 10 ноября 2014

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

Для сериализации данных мы используем атрибуты [datacontract] и [datamember]. Inваш случай, если вы используете datacontract WCF использует 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 голосов
/ 29 января 2011

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

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

Полный текст статьи можно найти здесь.

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

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

2 голосов
/ 10 января 2017

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

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

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

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

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

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

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

0 голосов
/ 27 декабря 2016

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

0 голосов
/ 07 марта 2013

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

...