Коли використовувати атрибути DataContract та DataMember?


179

Мене дуже бентежить 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);      
}

Ідеальна відповідь - тут stackoverflow.com/questions/5681842/…
Асіф Ікбал,

Відповіді:


361

Оскільки багато програмістів були переповнені атрибутами [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

Тож для швидкого рішення триває, а залишення атрибутів [DataContract]і [DataMember]атрибутів спрацює - але все-таки хороша ідея мати їх у своїх класах даних - просто щоб бути більш чіткими щодо того, що ви робите, і дати собі доступ до всіх тих додаткових функцій, які ви не можете отримати без них ...


ви маєте на увазі за замовчуванням всі типи даних внутрішньо позначені як серіалізаційні, і ми використовували DataContract / DataMember для їх обмеження.
santosh singh

2
@Santosh: якщо у вас є клас із деякими загальнодоступними властивостями, вони будуть серіалізовані за допомогою серіалізатора договорів даних WCF, якщо ви прямо не застосуєте [DataContract] / [DataMember]. що ні
marc_s

36
@Arthis: це не зовсім так. Станом на .NET 3.5 SP1, WCF буде щасливо сериализации класів без якої - небудь [DataContract] і [DataMember]атрибутів ... але як тільки ви почнете використовувати один з цих атрибутів, то така поведінка « по умовчанням» перестане працювати - як тільки у вас є єдиний [DataMember] в вашому клас, з цього моменту серіалізуватимуться лише ті властивості з цим атрибутом.
marc_s

4
О-о! Thx для уточнення цього пункту! Я копаю його трохи далі!
Артіс

6
Youhou! це скелі !! Мерсі боку!
Артіс

16

Що стосується WCF, ми можемо спілкуватися з сервером та клієнтом через повідомлення. Для передачі повідомлень та від потенційної безпеки нам потрібно зробити дані / повідомлення у серіалізованому форматі.

Для серіалізації даних ми використовуємо атрибути [datacontract] та [datamember]. У вашому випадку, якщо ви використовуєте datacontractWCF, використовується DataContractSerializerінше, XmlSerializerяке використовується WCF, що є технікою серіалізації за замовчуванням.

Поясню докладно:

в основному WCF підтримує 3 типи серіалізації:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - Замовлення за замовчуванням - Те саме, що і клас

DataContractSerializer / NetDataContractSerializer : - Порядок за замовчуванням є алфавітним

XmlSerializer : - XML-схема є великою

DataContractSerializer / NetDataContractSerializer : - Схема XML обмежена

XmlSerializer : - Підтримка версій не можлива

DataContractSerializer / NetDataContractSerializer : - Можлива підтримка версій

XmlSerializer : - Сумісність з ASMX

DataContractSerializer / NetDataContractSerializer : - Сумісність з видаленням .NET

XmlSerializer : - Атрибут не потрібен у XmlSerializer

DataContractSerializer / NetDataContractSerializer : - Атрибут, необхідний для цієї серіалізації

тому те, що ви використовуєте, залежить від ваших вимог ...


8

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

Фонд комунікацій Windows (WCF) використовує механізм серіалізації, який за замовчуванням називається Serializer Data Contract, щоб серіалізувати та десеріалізувати дані (перетворювати їх у XML і з них). Усі примітивні типи .NET Framework, такі як цілі числа та рядки, а також деякі типи, які трактуються як примітиви, такі як DateTime та XmlElement, можуть бути серіалізовані без будь-якої іншої підготовки та вважаються такими, що мають договори даних за замовчуванням. Багато типів .NET Framework також мають існуючі договори даних.

Повну статтю ви можете знайти тут.


2
Це все правда і добре, але це насправді не відповідає на питання ОП щодо того, чому серіалізатор договорів даних також працює без жодних атрибутів [DataContract] та [DataMember] у ваших класах ....
marc_s

Чи може хтось мені сказати, яке фактичне використання DataContract? - Я думаю , що принаймні частина питання буде відповіла.
IАнотація

2

Договір даних - це формальна угода між службою та клієнтом, яка абстрактно описує дані, що підлягають обміну.

Договір даних може бути явним або неявним. Простий тип, наприклад, int, string і т.д., має неявний договір даних. Об'єктом, визначеним користувачем, є явний або складний тип, для якого потрібно визначити договір даних за допомогою атрибутів [DataContract] та [DataMember].

Договір даних можна визначити так:

  • Він описує зовнішній формат даних, переданих в сервісні операції та з них

  • Він визначає структуру та типи даних, що обмінюються в сервісних повідомленнях

  • Він відображає тип CLR в XML-схему
  • Він визначає, як типи даних серіалізуються та десеріалізуються. За допомогою серіалізації ви перетворюєте об'єкт у послідовність байтів, які можуть передаватися по мережі. Десаріалізацією ви збираєте об'єкт із послідовності байтів, яку ви отримуєте від програми, що викликає.
  • Це система версій, яка дозволяє керувати змінами структурованих даних

Нам потрібно включити System.Runtime.Serialization до проекту. Ця збірка містить атрибут DataContract і DataMember.


2
  1. Договір даних: Він визначає, що ваш клас сутності готовий до процесу серіалізації.

  2. Учасники даних: Вказується, що конкретне поле є частиною договору з даними та його можна серіалізувати.


0

Крім того, коли ви зателефонуєте з http-запиту, він буде працювати належним чином, але коли ви намагатиметесь зателефонувати з net.tcp, ви отримаєте всі подібні речі


0

Атрибут DataMember не обов'язковий для додавання для серіалізації даних. Коли атрибут DataMember не доданий, старий XMLSerializer серіалізує дані. Додавання DataMember надає корисні властивості, такі як порядок, ім'я, потрібні, які не можна використовувати інакше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.