由於java中的每個類都擴展了java.lang.Object,因此一切都可以反序列化回java.lang.Object。如果您設法序列化具有不可序列化字段的對象,則無法知道反序列化中該字段的類。因爲每個類都是一個對象,所以你總是可以回到Object類。
class NonSerializableUser {}
class SerializableUser implements Serializable{}
class SomeObject implements Serializable{
public NonSerializableUser nonUser;
public SerializableUser user;
public Object nonUserObj;
public SomeObject(SerializableUser u, NonSerializableUser uu, NonSerializableUser uuu){
user = u;
nonUser = uu;
nonUserObj = uuu;
}
}
在這個例子中反序列化這個類會導致非用戶被空,用戶是正確的SerializableUser類的實例,並nonUserObj將是非零但它已經失去了所有的NonSerializableClass方法和字段,他們將不會有已連載。該實例中唯一被序列化的部分是屬於Object的方法和字段。
值得一提的是,大量的序列化庫(ObjectOutputStream的爲例)會抱怨非序列化類,並在第一時間將不序列化此對象。這就是爲什麼我忽略了序列化/反序列化步驟的細節。但是大量的XML框架仍將序列化這些類,這往往是哪裏這個bug撫養它的頭的情況。
也許筆者預計,如果您任意選擇java.lang.Object作爲一個屬性(最普遍的類型,對此你不能假設任何事情)的類型,而不是某種特定類型的,你已經清楚地知道該序列不能在這方面合理工作。但我同意這個例外很奇怪:畢竟,這個錯誤很可能是因爲你簡單地忘記了瞬態修飾符! – 2011-05-05 15:14:45
它可能有一些做與鎖定的對象。 – Matt 2011-05-05 15:19:30
或者可能是數組。 – 2011-05-05 15:43:30