當我繼承下面的代碼(和使用它存儲的數據,即A的序列化實例):跳過新瞬態字段反序列化
class A implements Serializable {
private static final long serialVersionUID = 1L;
int someField;
B b;
}
class B implements Serializable {
private static final long serialVersionUID = 1L;
int someField;
}
在某些時候我意識到,在A
的b
字段不應該實際上堅持(和B
不應該是可序列化的話),所以我改變的東西:
class A implements Serializable {
private static final long serialVersionUID = 1L;
int someField;
transient B b;
}
class B {
int someField;
}
如果我做的A
一個新的實例,並對其進行序列化,我沒有問題反序列化它。但是,如果我嘗試反序列化的已存儲的老代碼A
情況下,我得到以下形式的除外:
java.io.InvalidClassException: B; B; class invalid for deserialization
at java.io.ObjectStreamClass.checkDeserialize(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
我相信這是因爲持續的數據也有A
的和B
的類的描述存儲,並且那些仍然認爲b
是持久的,即使在當前版本中它們不再是(參見ObjectStreamClass中的行600到606)
是否有強制A的反序列化跳過字段的方法現在暫時?例如,是否有一種方法可以覆蓋反序列化代碼在ObjectInputStream
中讀取的類描述,並更新其定義b
,以便知道其瞬態?
我最終編寫了一個「修復」任務,讀取和寫回A/B類的類定義,它們是向後/向前兼容的(b字段是暫時的,但B仍被標記爲實現Serializable) ,然後我能夠從B中移除Serializable實現,現在沒有一個A的持久實例有B的實例。 – 2010-05-18 13:39:57