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?

Jawaban:


176

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.

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).


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.