Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在反序列化之后调用第一个构造函数而不调用其他构造函数_Java_Serialization - Fatal编程技术网

Java 为什么在反序列化之后调用第一个构造函数而不调用其他构造函数

Java 为什么在反序列化之后调用第一个构造函数而不调用其他构造函数,java,serialization,Java,Serialization,请有人解释一下为什么在反序列化之后调用了类“Gambler”的构造函数,但是说没有调用类“Player”的构造函数 import java.io.*; class Gambler { Gambler() { System.out.print("d"); } } class Person extends Gambler implements Serializable { Person() { System.out.print("c"); } } class Play

请有人解释一下为什么在反序列化之后调用了类“Gambler”的构造函数,但是说没有调用类“Player”的构造函数

import java.io.*;
  class Gambler {
   Gambler() { System.out.print("d"); }
  }
  class Person extends Gambler implements Serializable {
   Person() { System.out.print("c"); }
  }
  class Player extends Person {
   Player() { System.out.print("p"); }
 }

  class CardPlayer extends Player implements Serializable {
    CardPlayer() { System.out.print("c"); }
      public static void main(String[] args) {
      CardPlayer c1 = new CardPlayer();
      try {
            FileOutputStream fos = new FileOutputStream("play.txt");
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(c1);
            os.close();
            FileInputStream fis = new FileInputStream("play.txt");
            ObjectInputStream is = new ObjectInputStream(fis);
            CardPlayer c2 = (CardPlayer) is.readObject();
            is.close(); 

            } 
      catch (Exception x ) { }
 }
}

因为
Gambler
类没有实现
Serializable
接口。从可序列化的javadocs中:

为了允许序列化不可序列化类的子类型,子类型可以负责保存和恢复超类型的公共、受保护和(如果可访问)包字段的状态。只有当子类型扩展的类具有可访问的无参数构造函数来初始化类的状态时,子类型才可以承担此责任。如果不是这样,则声明类可序列化是错误的。错误将在运行时检测到

在反序列化过程中,不可序列化类的字段将使用该类的public或protected no arg构造函数进行初始化。无参数构造函数必须可被可序列化的子类访问可序列化子类的字段将从流中恢复。


请参阅。

,因为
Gambler
类未实现
可序列化接口。从可序列化的javadocs中:

为了允许序列化不可序列化类的子类型,子类型可以负责保存和恢复超类型的公共、受保护和(如果可访问)包字段的状态。只有当子类型扩展的类具有可访问的无参数构造函数来初始化类的状态时,子类型才可以承担此责任。如果不是这样,则声明类可序列化是错误的。错误将在运行时检测到

在反序列化过程中,不可序列化类的字段将使用该类的public或protected no arg构造函数进行初始化。无参数构造函数必须可被可序列化的子类访问可序列化子类的字段将从流中恢复。


请参阅。

序列化对象树被持久化时
在您的案例中,对象树最多为
Person
类。 现在,若父类对于任何子类都不可序列化,那个么
Super()。这就是为什么要调用您的
Gambler
构造函数的原因

你可以找到更多关于

在反序列化过程中,不可序列化类的字段将使用该类的public或protected no arg构造函数进行初始化。无参数构造函数必须可被可序列化的子类访问。可序列化子类的字段将从流中恢复


序列化对象树将被持久化
,在您的情况下,对象树将达到
Person
类。 现在,若父类对于任何子类都不可序列化,那个么
Super()。这就是为什么要调用您的
Gambler
构造函数的原因

你可以找到更多关于

在反序列化过程中,不可序列化类的字段将使用该类的public或protected no arg构造函数进行初始化。无参数构造函数必须可被可序列化的子类访问。可序列化子类的字段将从流中恢复


谢谢我相信这是解决方案谢谢我相信这是解决方案因为这是对象序列化规范中规定的?因为这是对象序列化规范中规定的?