[英]Java serialization with backward compatibility issue of member variable type changes
我有一個帶有成員變量的序列化類,並且正在將其寫入文件,即文件中的每個記錄都代表該類。 后來,根據新要求,成員變量的類型之一被更改,並且可以很好地寫入新文件。 但是,當我嘗試讀取舊文件(此更改之前寫入的文件)時,它拋出ClasscastException,提示“無法將舊數據類型成員分配給新文件”。 例如:我的班級結構將是:
Public class MyClass implements Serializable
{
Date m_date;
String m_name;
}
因此,這代表文件中的一條記錄。 然后,根據新要求,我將“ m_date”變量數據類型從“日期”更改為“自定義類型”(“自定義類”,也可以說是可序列化的ABC),因此類結構現在變為:
Public class MyClass implements Serializable
{
ABC m_date;
String m_name;
}
所以,我在這里面臨的問題是,當我嘗試讀取具有Date和String類型的每個記錄的舊文件時,在此代碼行上引發了異常:
while ( ( record = inputStream.readObject() ) != null )
因此,它清楚地表明,在讀取記錄時,它無法將日期類型分配給不兼容的類型ABC。
我的問題是:如何確保在讀取舊文件時,可以將Date類型更新為ABC並返回更新的記錄,所以更新記錄將具有ABC和String類型的值?
注意:我已經有可用的邏輯來將日期類型更改為ABC。
請提供/指導我帶有編碼示例的解決方案。
〜感謝。
您別無選擇。 您必須將類更改回原始定義。 然后,我將使用新名稱將新的ABC
類型添加為新的數據成員。 或者,您可以提供將舊的m_date
成員映射到新的ABC
數據類型的m_date
器和設置器。
一旦有了現有序列化,就不能繼續對類進行序列化不兼容的更改,如果您希望繼續讀取該類,則更改非靜態非臨時成員字段的類型是不兼容的更改。 請參閱Java序列化規范的“對象版本控制”一章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.