Как я могу игнорировать свойство при сериализации с помощью DataContractSerializer?

125

Я использую .NET 3.5SP1 и DataContractSerializer для сериализации класса. В SP1 они изменили поведение, так что вам не нужно включать атрибуты DataContract / DataMember в класс, и он просто сериализует все это. Это то поведение, которое я использую, но теперь мне нужно игнорировать одно свойство сериализатора. Я знаю, что один из способов сделать это - добавить к классу атрибут DataContract и просто поместить атрибут DataMember на все члены, которые я хочу включить. Однако у меня есть причины, по которым это не сработает.

Итак, мой вопрос: есть ли атрибут или что-то, что я могу использовать, чтобы DataContractSerializer игнорировал свойство?

NotDan
источник

Ответы:

176

IgnoreDataMemberAttribute ?

Пол Руан
источник
5
На моем уровне домена не было правильной ссылки на сборку, тогда я пропустил документацию и в конечном итоге подумал, что это новая функция .NET 4.5. Безуспешно пытался найти эту ветку, чтобы удалить мой комментарий (очень спешил). Кроме того, дата этого ответа должна была стать звонком .... Сообщение .NET 4.5 2009 ...) Извините за потраченное время.
Pluc 07
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]в свойство.
Doug
источник
1
что вы имели в виду под "украсили ваш класс", пожалуйста, объясните?
alamin 01
Если вы не использовали в своем классе какие-либо атрибуты, такие как [DataContract] или [Serializable], вы должны добавить [IgnoreDataMember] к свойству, которое не хотите сериализовать. См. Ответ Пола или checkoutall.com/Blog/Index/201410240204236271/…
Дуг
8
Это намного информативнее, чем принятый ответ.
pvgoran
Есть ли способ игнорировать этот член и продолжить сериализацию структуры / класса данных?
ryanwebjackson
Как насчет исключения PROPERTY при использовании [Serializable]?
Дэниел
32

В 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
Вы можете найти документ здесь (3-й абзац, 2-е предложение): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan,
Вы правы насчет ссылки, которую вы разместили, я не уверен, почему они тоже не упоминают ее там.
NotDan