[英]Serializing an object which has a non-serializable parent class
下面的代碼是如何工作的?
class A {
int a = 10;
}
class B extends A implements Serializable{
}
public class Test {
public static void main(String[] args){
B obj = new B();
obj.a = 25;
//Code to serialize object B (B b= new B()),
// deserialize it and print the value of 'a'.
}
}
即使我在代碼中更改了“a”的值,代碼也會打印 10。
對這種行為有什么解釋嗎?
a
的默認值為 10 - 創建 object 時將設置為 10。 如果要進行實際測試,請在實例化后將其設置為不同的值,然后將其序列化。
至於您的更新 - 如果 class 不可序列化,則其字段不會序列化和反序列化。 只有可序列化子類的字段。
由於B
擴展A
,因此它是A
。 這意味着b instanceof Serializable
返回true
。
所以,只要你嘗試序列化的object對於instanceof Serializable
檢查返回true,就可以序列化了。 這適用於包含在此 object 本身中的任何復合對象。
但是你不能做A a = new A();
並嘗試序列化a
.
考慮一下:
java.lang.Object
沒有實現Serializable
。 因此,在這種情況下,沒有人能夠序列化 Java 中的任何對象。 根本不是這種情況,此外,在涉及多個擴展公共超類型的 JavaBeans 的項目中,一般做法是使此超類型實現Serializable
以便所有子類都不必這樣做。
If class B extends class A, and A is not serializable, then all the instance variables of class A are initialized with their default values (which is 10 in this case) after de-serialization of class B.
如果您是可序列化的 class,但您的超類不可序列化,那么您從該超類繼承的任何實例變量都將重置為在 object 的原始構造期間給出的值。 這是因為不可序列化的 class 構造函數將運行,事實上,第一個不可序列化 class 構造函數之上的每個構造函數也將運行,無論如何,因為一旦調用了第一個超級構造函數(在反序列化期間)。 它當然會調用它的超級構造函數,等等 inheritance 樹。
如果父 class 不可序列化,則每次反序列化 object 時都會初始化其字段。 即 object 仍然需要構建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.