2009-02-08 79 views
2

我正在處理一系列使用DataContractSerializer序列化和反序列化的字體。在這兩個步驟之間,可以想象用戶已經從他們的機器中刪除了一種字體。我想檢查字體名稱,因爲它正在反序列化,以確保它仍然存在於系統中。如果它不存在,則該元素不包含在由DataContractSerializer.ReadObject()返回的集合中。反序列化驗證

具體而言,我存儲了一個FontFamily並序列化了一個屬性,獲得FontFamily.Name。在此屬性的set訪問器中,我將字符串轉換回FontFamily

我能想到的唯一合理的驗證替代方法是使屬性的set訪問器忽略無效值,並在稍後過濾掉無效的反序列化對象。但是我不喜歡這個選擇 - 是否有更合適的方法?

回答

3

爲什麼不利用OnDeserializedAttribute?讓您的回撥進行驗證並刪除對客戶端環境無效的項目。

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

我有關於你將如何去圓跳閘的數據,如果你在幕後刪除或修改數據的擔憂。 (例如:我記得老版本的MS Publisher特別沮喪,因爲我在兩臺不同的機器上處理一個文檔,這兩臺機器連接到兩臺不同的打印機上,每當我在一臺機器上修改文件時,Publisher會重新格式化該文件的目標打印機連接到該機器當我回到另一臺機器,我打算做的實際打印,出版商將重新格式化,但利潤率將不太正確,所以我需要調整更多)

+0

我想那樣可以。我仍然不喜歡這個無效項目仍然被創建的想法,但我想我可以在這種情況下接受它。 Re:數據可移植性,目前,我不會擔心在多臺機器上使用序列化文件。也許以後。 – 2009-02-08 21:06:22

0

您也可以爲您的類實現IXmlSerializable,其中包括您自己的實現ReadXml,允許您在對象被反序列化時執行任何驗證。

+0

雖然有效,但對於XmlSerializer(不執行回調)來說,這是很多額外的工作,這是唯一的方法,但對於DataContractSerializer,回調路由更爲可取。 – 2009-02-08 18:18:48