2016-04-07 16 views
-1

と呼ばれていますが期待どおりに働いているシリアル化をしながらdeserilization、親クラス(シリアル・インタフェースを実装していない)コンストラクタは二回

public class D{ 

    private String name; 

    public D(){ 
     System.out.println("class D : constructor called !!"); 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 
} 

public class E extends D implements Serializable{ 

    private String name; 

    public E(){ 
     System.out.println("class E : constructor called !!"); 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 
} 

以下のように私は2つの分類に定義されている、そのためのコードは次のとおりです。 - シリアル化コンストラクタ連鎖中に

public class TestSerialization{ 

    private static final String FILE_NAME = "E.ser"; 

    public static void main(String[] args){ 

     E e = new E(); 
     e.setName("New Name added"); 
     writeObject(e); 
     E finalE = readObject(); 
     System.out.println(finalE.getName()); 

    } 

    private static E readObject(){ 
     E e = null; 
     try{ 
      FileInputStream fis = new FileInputStream(FILE_NAME); 
      ObjectInputStream inputStream = new ObjectInputStream(fis); 
      e =(E)inputStream.readObject(); 
      inputStream.close(); 
     }catch (FileNotFoundException ex){ 
      System.out.println("Exception : "+ex.getMessage()); 
     }catch (IOException ex){ 
      System.out.println("Exception : "+ex.getMessage()); 
     }catch (ClassNotFoundException ex){ 
      System.out.println("Exception : "+ex.getMessage()); 
     } 
     return e; 
    } 

    private static void writeObject(E e){ 
     try{ 
      FileOutputStream fos = new FileOutputStream(FILE_NAME); 
      ObjectOutputStream outputStream = new ObjectOutputStream(fos); 
      outputStream.writeObject(e); 
      outputStream.flush(); 
      outputStream.close(); 
     }catch (FileNotFoundException ex){ 
      System.out.println("Exception : "+ex.getMessage()); 
     }catch (IOException ex){ 
      System.out.println("Exception : "+ex.getMessage()); 
     } 
    } 
} 

が正しい来ている: - 出力

class D : constructor called !! 
class E : constructor called !! 

が、直列化復元の際に、それは少し混乱して: - 出力

class D : constructor called !! 
class E : constructor called !! 
class D : constructor called !! 

クラスDのコンストラクタが再び呼び出されるのはなぜ?

私はあなたが混乱しているか、あなたの出力はそう

class D : constructor called !! 
class E : constructor called !! 
Serialization Started 
Deserialization Started 
class D : constructor called !! 
New Name added 

ようになります

public static void main(String[] args){ 

    E e = new E(); 
    e.setName("New Name added"); 

    System.out.println("Serialization Started"); 
    writeObject(e); 

    System.out.println("Deserialization Started"); 
    E finalE = readObject(); 
    System.out.println(finalE.getName()); 

} 

としては、メインクラスにコードを変更した場合のコンセプト

を誤解していると思います

答えて

1
During Serialization Constructor chaining is coming correct :- Output 

class D : constructor called !! 
class E : constructor called !! 

あなたはここで見ることができますEとDのコンストラクタは直列化の時に呼び出されませんが、オブジェクトeを作成しています。

オブジェクトの逆シリアル化中に、そのコンストラクタは呼び出されませんが、親のデフォルトのコンストラクタが呼び出されます。

だから、すべての親クラスのパラメータなしで標準のコンストラクタを持つことが必須であるか、そうでなければあなたは、あなたが構築したときに印刷された2つのメッセージをダブルカウントされている例外java.io.InvalidClassExceptionに

0

がスローされますE。それは非直列化の一部ではありません。

関連する問題