簡體   English   中英

Java序列化具有成員變量類型更改的向后兼容性問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM