ฉันจะละเว้นคุณสมบัติเมื่อทำให้อนุกรมโดยใช้ DataContractSerializer ได้อย่างไร


125

ฉันใช้. NET 3.5SP1 และ DataContractSerializer เพื่อจัดลำดับคลาส ใน SP1 พวกเขาเปลี่ยนลักษณะการทำงานเพื่อที่คุณจะได้ไม่ต้องรวมแอตทริบิวต์ DataContract / DataMember ไว้ในคลาสและมันจะทำให้ทุกอย่างเป็นอนุกรม นี่คือพฤติกรรมที่ฉันใช้ แต่ตอนนี้ฉันต้องละเว้นคุณสมบัติหนึ่งจากตัวทำให้อนุกรม ฉันรู้ว่าวิธีหนึ่งในการทำเช่นนี้คือการเพิ่มแอตทริบิวต์ DataContract ลงในคลาสและใส่แอตทริบิวต์ DataMember ให้กับสมาชิกทั้งหมดที่ฉันต้องการรวมไว้ ฉันมีเหตุผลที่จะไม่ได้ผลสำหรับฉัน

ดังนั้นคำถามของฉันคือมีแอตทริบิวต์หรือสิ่งที่ฉันสามารถใช้เพื่อทำให้ DataContractSerializer ละเว้นคุณสมบัติได้หรือไม่

คำตอบ:


176

5
เลเยอร์โดเมนของฉันไม่มีการอ้างอิงแอสเซมบลีที่ถูกต้องจากนั้นฉันก็พลาดอ่านเอกสารประกอบและคิดว่ามันเป็นคุณสมบัติใหม่ของ. NET 4.5 พยายามค้นหากระทู้นี้เพื่อลบความคิดเห็นของฉันไม่สำเร็จ (กำลังรีบ) นอกจากนี้การดูวันที่ของคำตอบนี้ควรกดกริ่ง .... 2009 .NET 4.5 โพสต์ ... ) ขออภัยที่เสียเวลา
Pluc

2
บน. NET 4.5 ที่นี่: System.Runtime.Serialization.IgnoreDataMemberAttribute ใช้ได้กับทุกสิ่ง
SparK

1
แม้แต่ไลบรารีของบุคคลที่สามยังได้เพิ่มการสนับสนุนสำหรับ [IgnoreDataMember] เช่น JSON.NET
ดั๊ก

5
ตัวอย่างสั้น ๆ จะไม่ทำให้คำตอบนี้คุ้มกับคะแนนโหวตจริงหรือ?
TaW

1
คำตอบนี้ไม่สมบูรณ์และทำให้เข้าใจผิด [IgnoreDataMember]จะไม่ทำงานถ้าคลาสมี[Serializable]แอตทริบิวต์ ดูรายละเอียดในคำตอบโดยดั๊ก
Alex Fainshtein

165

นอกจากนี้ DataContractSerializer จะทำให้เป็นซีเรียลไลซ์รายการที่ทำเครื่องหมายเป็น [Serializable] และจะทำให้เป็นซีเรียลไลซ์ประเภทที่ไม่มีเครื่องหมายใน. NET 3.5 SP1 ขึ้นไปเพื่อให้รองรับการทำให้เป็นอนุกรมประเภทที่ไม่ระบุชื่อ

ดังนั้นจึงขึ้นอยู่กับว่าคุณตกแต่งชั้นเรียนของคุณอย่างไรเพื่อป้องกันไม่ให้สมาชิกต่อเนื่องกัน:

  • หากคุณใช้[DataContract]ให้ลบ[DataMember]สำหรับคุณสมบัติ
  • หากคุณใช้[Serializable]ให้เพิ่มที่[NonSerialized]ด้านหน้าของฟิลด์สำหรับคุณสมบัติ
  • หากคุณยังไม่ได้ตกแต่งชั้นเรียนของคุณคุณควรเพิ่ม[IgnoreDataMember]สถานที่ให้บริการ

1
"ตกแต่งชั้นเรียน" หมายความว่าอย่างไรกรุณาอธิบาย
alamin

หากคุณไม่ได้ใช้แอตทริบิวต์ใด ๆ ในคลาสของคุณเช่น [DataContract] หรือ [Serializable] คุณจะต้องเพิ่ม [IgnoreDataMember] ให้กับคุณสมบัติที่คุณไม่ต้องการทำให้เป็นอนุกรม ดูคำตอบของ Paul หรือcheckoutall.com/Blog/Index/201410240204236271/…
Doug

8
นี่เป็นข้อมูลมากกว่าคำตอบที่ยอมรับ
pvgoran

มีวิธีใดบ้างที่จะเพิกเฉยต่อสมาชิกรายนั้นและทำให้โครงสร้างข้อมูล / คลาสเป็นลำดับต่อไป
ryanwebjackson

การยกเว้นพร็อพเพอร์ตี้เมื่อใช้ [Serializable] เป็นอย่างไร
Daniel

32

ใน XML Serializing คุณสามารถใช้แอตทริบิวต์ [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) เพื่อละเว้นคุณสมบัติเมื่อจัดลำดับคลาส

สิ่งนี้อาจเป็นประโยชน์สำหรับคุณ (หรืออาจใช้กับทุกคนที่พบคำถามนี้เมื่อพยายามหาวิธีละเว้นคุณสมบัติเมื่อทำให้เป็นอนุกรมใน XML เหมือนที่ฉันเคยเป็น)


4
โหวตลบอ่า แค่คิดว่าฉันจะโพสต์แบบนั้นเพราะเมื่อฉันค้นหาวิธีละเว้นคุณสมบัติเมื่อจัดลำดับชั้นเรียนโพสต์นี้จึงเกิดขึ้น และฉันอยากจะใส่ไว้ที่นี่หากใครพบโพสต์นี้แบบเดียวกับที่ฉันทำ
Kris Adams

[ในเมตา] ฉันคิดว่าพวกเขาให้คะแนนเป็นลบเพราะคุณควรเปิดคำถามอื่น (เฉพาะเจาะจงมากกว่านี้) เกี่ยวกับ XMLSerialization แล้วตอบคำถามผู้คนจะพบว่าคำถามนั้นมีความเกี่ยวข้องมากกว่าในการค้นหา
SparK

8
คำตอบนี้คือสิ่งที่ฉันกำลังมองหา
aclave1

2

ลองทำเครื่องหมายฟิลด์ด้วยแอตทริบิวต์ [NonSerialized ()] สิ่งนี้จะบอกให้ serializer ละเว้นฟิลด์

https://msdn.microsoft.com/en-us/library/system.nonserializedattribute(v=vs.110).aspx


1
ไม่ใช่เมื่อใช้ DataContractSerializer
Tom

1
เขาถามถึงคุณสมบัติไม่ใช่เขตข้อมูล!
TaW

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.