2008-09-16 90 views
6

有沒有人遇到過問題,將組件序列化成文件並讀回來,特別是在組件供應商升級VCL組件的區域。例如一個用DelphiX序列化的文件,然後幾年後用delphiY回讀。序列化格式是否改變,如果有的話,可以做些什麼來防止升級時組件中的錯誤讀取。Delphi組件序列化

回答

3

用於序列化已發佈屬性的內置RTTI系統易受組件更改影響。只要舊物業保存在新物品中,前行就可以管理。即你可以按照原樣離開財產界面,但如果你願意的話,可以拋棄內容。向後退卻更糟糕 - 由於新版本保存的屬性無法在舊版本加載中打開,這將是一個問題。

有些組件/庫(http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes)可以添加XML格式的序列化,這可能會有所幫助,因爲您可以選擇跳過您不知道的內容。

您仍需要注意您是如何設計發佈的內容,並且應該找到一種方法來「忽略但傳播」您當前版本無法理解的內容。這將允許您在嘗試保留較新的屬性時打開並更改較新格式的文件,而不是將其剝離。

+0

當您直接使用Classes.TReader併爲OnError事件編寫處理程序時,使用VCL-Streaming可以處理缺少的屬性(以及缺失的類和其他錯誤)。你找到了Classes單元中需要的所有代碼。 最大的缺點是您的類/類必須從TComponent派生或至少從TPersistent派生。 – 2010-03-16 09:48:46

0

由於供應商會向其組件添加功能,因此格式將明確更改。序列化只是遍歷所有已發佈的屬性並將它們保存到流中。當它們被讀回時,從流中讀取的每個屬性都將被設置回組件。如果該物業不存在了,你有問題。除了一些基本的異常處理外,我不認爲你可以做任何事情。

保證兼容性的最佳方法是自己做系列化。

0

感謝您的回覆。我試圖避免自定義序列化,並利用每個組件的序列化技術,但缺乏opf的任何方式來「升級」到一個新的組件格式我想自定義序列化是唯一的方法。

+0

只要您仍然閱讀支持舊的和過時的參數,就可以使新版本能夠讀取舊的流。問題在於讓舊發行版讀取新的流,而這些新流是沒有定製序列化的情況下無法完成的。 – 2008-09-17 06:46:45