Когда использовать атрибуты 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);      
}

Ответ 1

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

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

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

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

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

Ответ 2

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

Для сериализации данных мы используем атрибуты [datacontract] и [datamember]. В вашем случае, если вы используете datacontract WCF использует DataContractSerializer else, 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: - Атрибут, необходимый для этой сериализации

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

  • В нем описывается внешний формат данных, переданных в служебные операции и из них

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

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

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