Validasi deserialisasi

Saya sedang mengerjakan daftar font yang saya serialisasi dan deserialisasi menggunakan DataContractSerializer. Di antara dua langkah tersebut, dapat dibayangkan bahwa pengguna telah menghapus font dari mesin mereka. Saya ingin memeriksa nama font yang sedang dideserialisasi untuk memastikan bahwa nama font tersebut masih ada di sistem. Jika tidak ada, elemen tersebut tidak disertakan dalam koleksi yang dikembalikan oleh DataContractSerializer.ReadObject().

Secara khusus, saya menyimpan FontFamily dan membuat serial properti yang mendapat FontFamily.Name. Di set pengakses properti ini, saya mengonversi string kembali menjadi FontFamily.

Satu-satunya alternatif validasi yang masuk akal yang dapat saya pikirkan adalah meminta pengakses properti mengabaikan nilai yang tidak valid, dan memfilter objek deserialisasi yang tidak valid nanti. Namun saya tidak menyukai opsi ini - apakah ada cara yang lebih tepat?


person Matthew Maravillas    schedule 08.02.2009    source sumber


Jawaban (2)


Mengapa tidak memanfaatkan OnDeserializedAttribute? Minta panggilan balik Anda melakukan validasi dan penghapusan item yang tidak valid untuk lingkungan klien.

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

Saya memiliki beberapa kekhawatiran tentang bagaimana Anda akan melakukan tripping data jika Anda menghapus atau mengubah data di balik sampul.

(Misalnya: Saya ingat pernah merasa frustrasi dengan versi MS Publisher yang lebih lama ketika saya sedang mengerjakan dokumen pada dua mesin berbeda yang terhubung ke dua printer berbeda. Setiap kali saya memodifikasi file pada satu mesin, Publisher akan memformat ulang dokumen tersebut ke target printer yang terpasang pada mesin itu. Ketika saya kembali ke mesin lain tempat saya akan melakukan pencetakan sebenarnya, Publisher akan memformat ulang lagi, namun marginnya kurang tepat sehingga saya perlu melakukan penyesuaian lagi.)

person Ants    schedule 08.02.2009
comment
Saya kira itu tidak masalah. Saya masih tidak menyukai gagasan bahwa item yang tidak valid masih dibuat, tapi saya rasa saya bisa menerimanya dalam kasus ini. Perihal: portabilitas data, saat ini, saya tidak akan khawatir tentang membuat file serial dapat digunakan di banyak mesin. Mungkin nanti. - person Matthew Maravillas; 09.02.2009

Anda juga dapat mengimplementasikan IXmlSerializable untuk kelas Anda, yang akan menyertakan implementasi ReadXml Anda sendiri, memungkinkan Anda melakukan validasi apa pun yang Anda inginkan saat objek dideserialisasi.

person Factor Mystic    schedule 08.02.2009
comment
Meskipun valid, itu membutuhkan banyak pekerjaan ekstra... untuk XmlSerializer (yang tidak melakukan panggilan balik) itulah satu-satunya cara, tetapi untuk DataContractSerializer, rute panggilan balik jauh lebih disukai. - person Marc Gravell; 08.02.2009