2012-07-20 69 views
1

我的組織使用自定義序列化技術,我們使用輸出流迭代地存儲對象。我遇到以下問題:保持向後兼容性的多繼承序列化

ParentChild類實現SerializableParent班有字段a,b,cChild班有e。我將字段d添加到Parent並更新了父級的序列化,現在我們的舊客戶端無法正確讀取Child序列化代碼。這是因爲Child序列碼雲:

OutputStream in = getCurrentOutStream(); 

current_serialization_num = readVersionNum(in) // The version num is similar to Java's UID and is updated when fields are added. 
readParent(in) 
e = readField(in) 

由於序列化是通過DataOutputStream完成,良好的XML閱讀器不能照顧這。我對這個問題有一個醜陋的解決方案,但是它不會很好地延伸,所以我不想通過介紹它來污染讀者的思想。不過,我真的很想聽聽其他人會如何處理類似的情況。

+1

您是否維護一個串行版本並在進行更改時進行更新? – 2012-07-20 19:23:09

+0

是的,序列版本已更新,但客戶端的工具未更新。所以,它期望讀取Field e,但是它接收包含d的字節流,然後e。 – Sal 2012-07-20 19:28:14

回答

1

舊父對象創建的對象被舊serialVersionUID序列化。新的對象被新的serialVersionUID序列化。 你正在實現的方式是,Child無法同時讀取舊對象以及新對象。

您必須具有相同的serialVersionUID。如果編譯器抱怨放置壓制註釋。你想清楚地溝通編譯器它是同一個對象。

1

好的,看到多數民衆贊成在這個問題。我知道你使用這個類來序列化你的數據,但是,這是一個類def。問題不是序列化問題。你已經構建了你的類來以特定的方式讀取文件,現在你正在構造不同的文件。它不會「序列化」,因爲它不再是同一類型的文件。如果你說:我用一個然後b和c字段創建一個文件,這個類將在第一個字段中讀作a和第二個作爲b等等,然後改變文件用b,c和a來創建。老班級仍然會認爲'a'是第一位的,沒有理由不應該這樣做。