DataContractSerializer vs XmlSerializer: ข้อดีข้อเสียของ Serializer แต่ละตัว


86

แอปพลิเคชันเดสก์ท็อปของฉันจัดลำดับวัตถุโดยใช้XmlSerializerไฟล์. ฉันถูกแนะนำให้ใช้ประโยชน์DataContractSerializerแทน
ฉันควรใช้สถานการณ์DataContractSerializerใด

ขอบคุณมาก

ความคิดเห็น.
1. ไฟล์ XML เอาต์พุตถูกเก็บไว้ในเครื่อง ไม่มีแอปพลิเคชันอื่น ๆ ที่ยกเลิกการกำหนดค่าอ็อบเจ็กต์จากไฟล์ XML นั้น
2. แอปพลิเคชันของฉันทำงานด้วย. NET Framework 3.5 SP1


คำตอบ:


114

Dan Rigsby มีโพสต์สุดยอดเกี่ยวกับเรื่องนี้ - ไปอ่านกันเลย!

XmlSerializer กับ DataContractSerializer (ที่เก็บถาวรบนเว็บ)

เขาพูดทั้งหมดที่มีเพื่อพูดและด้วยวิธีที่น่าเชื่อมาก

ในระยะสั้น:

XmlSerializer:

  • มีมานานแล้ว
  • คือ "เลือกไม่ใช้"; ทุกสิ่งที่เผยแพร่ต่อสาธารณะจะถูกทำให้เป็นอนุกรมเว้นแต่คุณจะบอกว่าไม่ให้ทำ ([XmlIgnore])

DataContractSerializer คือ:

  • เด็กใหม่ในเมือง
  • ปรับให้เหมาะสมกับความเร็ว (โดยทั่วไปเร็วกว่า XmlSerializer ประมาณ 10%)
  • "opt-in" - เฉพาะสิ่งที่คุณทำเครื่องหมายโดยเฉพาะว่า[DataMember]จะถูกทำให้เป็นอนุกรม
  • แต่สิ่งที่มีเครื่องหมาย[DataMember]จะถูกทำให้เป็นอนุกรมไม่ว่าจะเป็นpublicหรือprivate
  • ไม่รองรับแอตทริบิวต์ XML (ด้วยเหตุผลด้านความเร็ว)

2
@ Paul-SebastianManole: DataContractSerializer ไม่รองรับแอตทริบิวต์ XML - ด้วยเหตุผลด้านความเร็ว จะอธิบายอะไรให้ละเอียด?
marc_s

6
@ Paul-SebastianManole: หาก XML ต้นทางของคุณมีแอตทริบิวต์ในองค์ประกอบ XML (เช่น<Customer Id="42"> ...) แสดงว่าคุณมีเพียงตัวเลือกเดียวที่ใช้ XML serializer
marc_s

2
สิ่งนี้อาจมีประโยชน์นำมาจาก MSDN: คลาส XmlSerializer สนับสนุนชุดประเภทที่แคบกว่าคลาส DataContractSerializer มาก แต่ช่วยให้สามารถควบคุม XML ที่เป็นผลลัพธ์ได้มากขึ้นและรองรับมาตรฐาน XML Schema definition language (XSD) ได้มากขึ้น นอกจากนี้ยังไม่ต้องใช้แอตทริบิวต์ที่เปิดเผยในประเภทที่ทำให้เป็นอนุกรมได้ ... คลาส XmlSerializer ไม่สนับสนุนประเภทสัญญาข้อมูล MSDN .
Paul-Sebastian Manole

1
@OO: ไม่เพียง แต่เลือกใช้ใน. NET 3.5 SP1 และใหม่กว่า - แต่สำหรับฉันมันยังคงเป็นวิธีที่ดีที่สุดในการทำสิ่งต่างๆ ให้คุณตั้งค่าคุณสมบัติที่ไม่สามารถตั้งค่าเป็นอย่างอื่นได้ (เช่นลำดับของการทำให้เป็นอนุกรมเนมสเปซและอื่น ๆ อีกมากมาย!)
marc_s

17
คำเตือนที่ใหญ่ที่สุดเกี่ยวกับ DataContractSerializer - เมื่อ deserializing จะให้ความสำคัญกับลำดับขององค์ประกอบและจะล้มเหลวโดยไม่โต้ตอบหากไม่อยู่ในลำดับที่ถูกต้อง อิมโฮเว้นแต่คุณจะใช้ชุดประกอบเดียวกันที่ปลายทั้งสองข้างสิ่งนี้จะทำให้เกิดอันตรายอย่างผิดปกติ
Pxtl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.