Bagaimana saya bisa mengabaikan properti saat membuat serial menggunakan DataContractSerializer?

125

Saya menggunakan .NET 3.5SP1 dan DataContractSerializer untuk membuat serial kelas. Di SP1, mereka mengubah perilakunya sehingga Anda tidak perlu menyertakan atribut DataContract / DataMember di kelas dan itu hanya akan membuat serial semuanya. Ini adalah perilaku yang saya gunakan, tetapi sekarang saya harus mengabaikan satu properti dari serializer. Saya tahu bahwa salah satu cara untuk melakukan ini adalah dengan menambahkan atribut DataContract ke kelas, dan cukup letakkan atribut DataMember pada semua anggota yang ingin saya sertakan. Saya punya alasan, meskipun, ini tidak akan berhasil untuk saya.

Jadi pertanyaan saya adalah, apakah ada atribut atau sesuatu yang dapat saya gunakan untuk membuat DataContractSerializer mengabaikan properti?

NotDan
sumber

Jawaban:

176

IgnoreDataMemberAttribute ?

Paul Ruane
sumber
5
Lapisan domain saya tidak memiliki referensi perakitan yang tepat, kemudian saya salah membaca dokumentasi dan akhirnya berpikir itu adalah fitur baru .NET 4.5. Mencoba menemukan kembali utas ini untuk menghapus komentar saya tanpa hasil (terburu-buru). Selain itu, melihat tanggal jawaban ini seharusnya sudah membunyikan bel .... 2009 .NET 4.5 post ...) Maaf telah membuang-buang waktu Anda.
Pluc
2
Di .NET 4.5 di sini: System.Runtime.Serialization.IgnoreDataMemberAttribute berfungsi untuk hal apa pun
SparK
1
Bahkan pustaka pihak ketiga telah menambahkan dukungan untuk [IgnoreDataMember], seperti JSON.NET.
Doug
5
Bukankah contoh singkat akan membuat ini menjadi jawaban yang benar-benar bernilai untuk dipilih?
TaW
1
Jawaban ini tidak lengkap dan dengan demikian menyesatkan. [IgnoreDataMember]tidak akan berfungsi jika kelas memiliki [Serializable]atribut. Lihat detail jawaban Doug .
Alex Fainshtein
165

Selain itu, DataContractSerializer akan membuat serial item yang ditandai sebagai [Serializable] dan juga akan membuat serialisasi tipe tak bertanda di .NET 3.5 SP1 dan yang lebih baru, untuk memungkinkan dukungan untuk serialisasi tipe anonim.

Jadi, itu tergantung pada bagaimana Anda mendekorasi kelas Anda tentang bagaimana mencegah anggota dari serialisasi:

  • Jika Anda menggunakan [DataContract], maka hapus [DataMember]untuk properti.
  • Jika Anda menggunakan [Serializable], tambahkan [NonSerialized]di depan bidang untuk properti.
  • Jika Anda belum mendekorasi kelas Anda, maka Anda harus menambahkan [IgnoreDataMember]ke properti.
Doug
sumber
1
apa yang Anda maksud dengan "menghias kelas Anda" tolong jelaskan?
alamin
Jika Anda belum pernah menggunakan atribut apa pun di kelas Anda, seperti [DataContract] atau [Serializable], Anda akan menambahkan [IgnoreDataMember] ke properti yang tidak ingin Anda serialisasi. Lihat jawaban Paul atau checkoutall.com/Blog/Index/201410240204236271/…
Doug
8
Ini jauh lebih informatif daripada jawaban yang diterima.
pvgoran
Apakah ada cara untuk mengabaikan anggota itu dan melanjutkan membuat serialisasi struktur / kelas data?
ryanwebjackson
Bagaimana dengan mengecualikan PROPERTI ketika [Serializable] digunakan?
Daniel
31

Dalam XML Serializing, Anda dapat menggunakan atribut [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) untuk mengabaikan properti saat membuat serial kelas.

Ini mungkin berguna bagi Anda (Atau mungkin berguna bagi siapa saja yang menemukan pertanyaan ini ketika mencoba untuk mencari tahu bagaimana mengabaikan properti saat Serializing dalam XML, seperti saya).

Kris Adams
sumber
4
Ah suara negatif. Hanya berpikir saya akan memposting itu karena ketika saya mencari cara mengabaikan properti saat membuat serial kelas, posting ini muncul. Dan saya ingin meletakkannya di sini jika ada yang menemukan posting ini dengan cara yang sama seperti saya.
Kris Adams
[dalam meta] Saya pikir mereka memilih negatif karena Anda harus membuka pertanyaan lain (yang lebih spesifik) tentang XMLSerialization dan menjawabnya, sehingga orang akan menganggap pertanyaan itu lebih relevan dalam pencarian mereka
SparK
8
Jawaban ini persis seperti yang saya cari
aclave1
0

Apa yang Anda katakan bertentangan dengan apa yang dikatakan di perpustakaan MSDN di lokasi ini:

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

Saya tidak melihat fitur SP1 yang Anda sebutkan.

Tony The Lion
sumber
1
Anda dapat menemukan dokumennya di sini (paragraf ke-3, kalimat ke-2): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan
Anda benar tentang tautan yang Anda posting, saya tidak yakin mengapa mereka tidak menyebutkannya di sana juga.
NotDan