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