簡體   English   中英

序列化具有不可序列化父 class 的 object

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

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