と呼ばれていますが期待どおりに働いているシリアル化をしながら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());
}
としては、メインクラスにコードを変更した場合のコンセプト
を誤解していると思います