DataContractSerializer kullanarak serileştirirken bir özelliği nasıl yoksayabilirim?


125

Bir sınıfı seri hale getirmek için .NET 3.5SP1 ve DataContractSerializer kullanıyorum. SP1'de davranışı değiştirdiler, böylece sınıfa DataContract / DataMember özniteliklerini dahil etmek zorunda kalmazsınız ve yalnızca her şeyi serileştirir. Kullandığım davranış bu, ancak şimdi serileştiriciden bir özelliği göz ardı etmem gerekiyor. Bunu yapmanın bir yolunun DataContract özniteliğini sınıfa eklemek ve dahil etmek istediğim tüm üyelere DataMember özniteliğini koymak olduğunu biliyorum. Ancak bunun benim için işe yaramayacağına dair nedenlerim var.

Yani sorum şu, DataContractSerializer'ın bir özelliği yok saymasını sağlamak için kullanabileceğim bir öznitelik veya başka bir şey var mı?

Yanıtlar:


176

5
Etki alanı katmanımın uygun derleme referansı yoktu, sonra belgeleri gözden kaçırdım ve .NET 4.5'in yeni bir özelliği olduğunu düşündüm. Yorumumu başarıyla silmek için bu konuyu bulmaya çalıştım (acelem vardı). Ayrıca, bu cevabın tarihine bakıldığında bir zil çalmış olmalıydı .... 2009 .NET 4.5 post ...) Zamanınızı boşa harcadığım için özür dilerim.
Pluc

2
.NET
4.5'te

1
Üçüncü taraf kitaplıkları bile JSON.NET gibi [IgnoreDataMember] desteği eklemiştir.
Doug

5
Kısa bir örnek, bunu gerçekten oylara değer bir yanıt yapmaz mı?
2018

1
Bu cevap eksiktir ve bu nedenle yanıltıcıdır. [IgnoreDataMember]sınıfın [Serializable]özniteliği varsa çalışmaz . Doug'un yanıtındaki ayrıntıları görün .
Alex Fainshtein

165

Ayrıca DataContractSerializer, anonim türleri serileştirme desteğine izin vermek için [Serileştirilebilir] olarak işaretlenen öğeleri serileştirecek ve ayrıca .NET 3.5 SP1 ve sonraki sürümlerde işaretlenmemiş türleri serileştirecektir.

Yani, bir üyenin serileştirmesini nasıl engelleyeceğiniz sınıfınızı nasıl dekore ettiğinize bağlıdır:

  • Kullandıysanız [DataContract], [DataMember]mülk için kaldırın .
  • Kullandıysanız [Serializable], mülk [NonSerialized]için alanın önüne ekleyin .
  • Sınıfınızı dekore etmediyseniz, [IgnoreDataMember]mülke eklemelisiniz .

1
Lütfen "sınıfınızı dekore edin" derken neyi kastettiniz?
alamin

Sınıfınızda [DataContract] veya [Serializable] gibi herhangi bir öznitelik kullanmadıysanız, serileştirmek istemediğiniz özelliğe [IgnoreDataMember] eklersiniz. Paul'un cevabını görün veya checkoutall.com/Blog/Index/201410240204236271/…
Doug

8
Bu, kabul edilen cevaptan çok daha bilgilendiricidir.
pvgoran

Bu üyeyi yok saymanın ve veri yapısını / sınıfını serileştirmeye devam etmenin bir yolu var mı?
ryanwebjackson

[Serileştirilebilir] kullanıldığında bir MÜLKİYİ hariç tutmaya ne dersiniz?
Daniel

32

XML Serileştirmede, bir sınıfı serileştirirken bir özelliği yok saymak için [XmlIgnore] özniteliğini (System.Xml.Serialization.XmlIgnoreAttribute) kullanabilirsiniz.

Bu sizin için yararlı olabilir (Ya da benim gibi XML'de Serileştirirken bir özelliği nasıl yok sayacağını bulmaya çalışırken bu soruyu bulan herkes için yararlı olabilir).


4
Ah olumsuz oy. Bunu yayınlayacağımı düşündüm çünkü bir sınıfı serileştirirken bir özelliği nasıl yok sayacağımı araştırdığımda bu yazı geldi. Ve biri bu gönderiyi benim yaptığım gibi bulursa buraya koymak istedim.
Kris Adams

[metada] sanırım olumsuz oy verdiler çünkü XMLSerialization hakkında başka (daha özel) bir soru açıp cevaplamalısınız, böylece insanlar bu soruyu aramalarında daha alakalı
bulsunlar

8
Bu cevap tam olarak aradığım
şeydi


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.