Як я можу проігнорувати властивість при серіалізації за допомогою DataContractSerializer?


125

Я використовую .NET 3.5SP1 і DataContractSerializer, щоб серіалізувати клас. У SP1 вони змінили поведінку так, що вам не доведеться включати атрибути DataContract / DataMember в клас, і це просто серіалізує всю справу. Це поведінка, яку я використовую, але тепер мені потрібно ігнорувати одне властивість із серіалізатора. Я знаю, що один із способів зробити це - додати атрибут DataContract до класу та просто помістити атрибут DataMember на всіх членів, які я хочу включити. Однак у мене є причини, що це не допоможе мені.

Отже, моє запитання: чи є атрибут чи щось, що я можу використати, щоб DataContractSerializer ігнорував властивість?

Відповіді:


176

5
Мій доменний шар не мав належної посилання на збірку, тоді я пропустив читання документації і, нарешті, думав, що це нова функція .NET 4.5. Спробував знайти цю тему, щоб видалити мій коментар без успіху (поспішав). Крім того, дивлячись на дату відповіді, повинен був би дзвонити дзвіночок .... 2009. NET 4.5 повідомлення ...) Вибачте, що витратили ваш час.
Плук

2
У .NET 4.5 тут: System.Runtime.Serialization.IgnoreDataMemberAttribute працює для будь-якої речі
SparK

1
Навіть сторонні бібліотеки додали підтримку [IgnoreDataMember], як-от JSON.NET.
Дуг

5
Чи не короткий приклад зробить цю відповідь справді вартістю голосів?
TaW

1
Ця відповідь є неповною і, таким чином, хибною. [IgnoreDataMember]не працює, якщо клас має [Serializable]атрибут. Деталі див. У відповіді Дуга .
Алекс Файнштейн

165

Крім того, DataContractSerializer буде серіалізувати елементи, позначені як [Serializable], а також буде серіалізувати немарковані типи в .NET 3.5 SP1 та пізніших версіях, щоб забезпечити підтримку серіалізації анонімних типів.

Отже, це залежить від того, як ви прикрасили свій клас, як уберегти учасника від серіалізації:

  • Якщо ви використовували [DataContract], видаліть [DataMember]для цього ресурсу.
  • Якщо ви використовували [Serializable], додайте [NonSerialized]перед полем для властивості.
  • Якщо ви не прикрасили свій клас, то вам слід додати [IgnoreDataMember]його до власності.

1
що ви мали на увазі під поясненням "прикрасив свій клас"?
аламін

Якщо ви не використовували жодних атрибутів у своєму класі, як-от [DataContract] або [Serializable], ви додасте [IgnoreDataMember] до властивості, яку ви не хочете серіалізувати. Дивіться відповідь Павла або checkoutall.com/Blog/Index/201410240204236271/…
Дуг

8
Це набагато інформативніше, ніж прийнята відповідь.
пвгоран

Чи є спосіб ігнорувати цього члена та продовжувати серіалізацію структури / класу даних?
ryanwebjackson

Як щодо виключення ВЛАСНОСТІ, коли використовується [Serializable]?
Даніель

31

У серіалізації XML ви можете використовувати атрибут [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute), щоб ігнорувати властивість при серіалізації класу.

Це може бути вам корисним (або воно може бути корисним для всіх, хто знайшов це питання при спробі з'ясувати, як ігнорувати властивість під час серіалізації в XML, як я був).


4
Ах негативний голос. Я просто подумав, що опублікую це, тому що коли я шукав, як ігнорувати властивість при серіалізації класу, з'явилася ця публікація. І я хотів розмістити його тут, якщо хтось знайшов цю посаду так само, як і я.
Кріс Адамс

[у мета] Я думаю, що вони проголосували негативно, тому що ви повинні відкрити ще одне (більш специфічне) питання щодо XMLSerialization та відповісти на нього, щоб люди знайшли це питання більш актуальним у своєму пошуку
SparK

8
Ця відповідь саме те, що я шукав
aclave1


0

Те, що ви говорите, суперечить тому, що йдеться у бібліотеці MSDN у цій локації:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx

Я не бачу жодної згадки про функцію SP1, яку ви згадуєте.


1
Ви можете знайти документ тут (третій абзац, 2-е речення): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan

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