การตรวจสอบความถูกต้องของการดีซีเรียลไลซ์

ฉันกำลังทำงานกับรายการแบบอักษรที่ฉันซีเรียลไลซ์และดีซีเรียลไลซ์โดยใช้ DataContractSerializer ในระหว่างสองขั้นตอนนี้ อาจเป็นไปได้ว่าผู้ใช้ลบแบบอักษรออกจากเครื่องแล้ว ฉันต้องการตรวจสอบชื่อแบบอักษรในขณะที่กำลังทำการดีซีเรียลไลซ์เพื่อให้แน่ใจว่ายังคงมีอยู่ในระบบ หากไม่มีอยู่ องค์ประกอบนั้นจะไม่รวมอยู่ในคอลเลกชันที่ส่งคืนโดย DataContractSerializer.ReadObject()

โดยเฉพาะ ฉันกำลังจัดเก็บ FontFamily และซีเรียลไลซ์คุณสมบัติที่ได้รับ FontFamily.Name ใน set accessor ของคุณสมบัตินี้ ฉันจะแปลงสตริงกลับเป็น FontFamily

ทางเลือกเดียวที่สมเหตุสมผลในการตรวจสอบที่ฉันคิดได้ก็คือให้ set accessor ของคุณสมบัติละเว้นค่าที่ไม่ถูกต้อง และกรองออบเจ็กต์ดีซีเรียลไลซ์ที่ไม่ถูกต้องออกในภายหลัง ฉันไม่ชอบตัวเลือกนี้ แต่มีวิธีที่เหมาะสมกว่านี้ไหม


person Matthew Maravillas    schedule 08.02.2009    source แหล่งที่มา


คำตอบ (2)


ทำไมไม่ใช้ประโยชน์จาก OnDeserializedAttribute ให้โทรกลับของคุณทำการตรวจสอบและลบรายการที่ไม่ถูกต้องสำหรับสภาพแวดล้อมไคลเอนต์

http://msdn.microsoft.com/en-us/library/ms733734.aspx

ฉันมีข้อกังวลบางประการเกี่ยวกับวิธีการที่คุณจะทำการสะดุดข้อมูลหากคุณลบหรือแก้ไขข้อมูลภายใต้หน้าปก

(ตัวอย่างเช่น: ฉันจำได้ว่ารู้สึกหงุดหงิดเป็นพิเศษกับ MS Publisher เวอร์ชันเก่า ขณะที่ฉันกำลังทำงานกับเอกสารบนเครื่องสองเครื่องที่เชื่อมต่อกับเครื่องพิมพ์สองเครื่อง เมื่อใดก็ตามที่ฉันแก้ไขไฟล์ในเครื่องเดียว Publisher จะฟอร์แมตเอกสารใหม่เพื่อกำหนดเป้าหมาย เครื่องพิมพ์ที่ติดอยู่กับเครื่องนั้น พอผมกลับไป อีกเครื่องที่จะพิมพ์จริง Publisher ก็ฟอร์แมตใหม่อีกครั้ง แต่ระยะขอบไม่ค่อยถูกต้อง เลยต้องปรับแต่งเพิ่มเติม)

person Ants    schedule 08.02.2009
comment
ฉันเดาว่ามันคงจะโอเค ฉันยังคงไม่ชอบความคิดที่ว่ารายการที่ไม่ถูกต้องยังคงถูกสร้างขึ้น แต่ฉันเดาว่าฉันสามารถอยู่กับมันได้ในกรณีนี้ Re: ความสามารถในการเคลื่อนย้ายข้อมูล ในขณะนี้ ฉันจะไม่ต้องกังวลกับการทำให้ไฟล์ซีเรียลไลซ์สามารถใช้งานได้บนเครื่องหลายเครื่อง ไว้ก่อน. - person Matthew Maravillas; 09.02.2009

คุณยังสามารถใช้ IXmlSerializable สำหรับคลาสของคุณได้ ซึ่งจะรวมการใช้งาน ReadXml ของคุณเองด้วย ซึ่งช่วยให้คุณทำการตรวจสอบความถูกต้องอะไรก็ได้ที่คุณต้องการในขณะที่วัตถุกำลังถูกดีซีเรียลไลซ์

person Factor Mystic    schedule 08.02.2009
comment
แม้ว่าจะใช้ได้ แต่ก็เป็นงานพิเศษมากมาย... สำหรับ XmlSerializer (ซึ่งไม่ได้ทำการเรียกกลับ) นั่นเป็นวิธีเดียว แต่สำหรับ DataContractSerializer เส้นทางการเรียกกลับจะดีกว่ามาก - person Marc Gravell; 08.02.2009