Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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,我试图通过示例了解反序列化是如何完成的: class A implements Serializable{ int x=3; long y=4; short z=5; } public class B extends A{ public B(){ x=7; } public String toString(){ return ""+x

我试图通过示例了解反序列化是如何完成的:

    class A implements Serializable{
        int x=3;
        long y=4;
        short z=5;
    }

    public class B extends A{
        public B(){
            x=7;
        }

      public String toString(){
          return ""+x+""+y+""+z;
      }
        public static void main(String[] args) {
            B b=new B();
    try{
                FileOutputStream fos=new FileOutputStream("ser.ser");
                ObjectOutputStream oos=new ObjectOutputStream(fos);
                oos.writeObject(b);
                oos.close();
                System.out.println(b);
                FileInputStream fis=new FileInputStream("ser.ser");
                ObjectInputStream ois=new ObjectInputStream(fis);
                b=(B)ois.readObject();
                ois.close();
                System.out.println(b);
            }
            catch(Exception e){
                e.printStackTrace();
            }
}
}
它会产生
745
,但当我
在B
类中实现serializable时,结果是
345


我无法理解类B的序列化所造成的差异…

当您反序列化一个对象时,对于层次结构中没有实现可序列化接口的所有类,将调用构造函数来初始化该类中的状态


因此,当类
B
未实现
Serializable
时,构造函数将运行,并将
7
分配给
x
,从而得到
745
。但是,当它实现
Serializable
时,不会发生这种情况,
x
的值将是对象序列化时的值,即在本例中为
3

您所说的是反序列化时的情况,对吗?如果是,那么你能为序列化和反序列化添加代码吗?@AlexR我猜他是在谈论反序列化后的输出,因为他得到了
345
。但我还是要求澄清,让我们看看。将相应地更新。我不明白执行
new B()
时类
B
的构造函数如何不运行。请注意,类
B
无法编译,因为看起来像构造函数的东西被称为
Puppy
。我相信OP尝试过他的代码的几个版本做了一些修改,然后发送到这里的版本根本无法编译,所以他的问题是不相关的….@AlexR哦亲爱的。没有注意到这一点。@AlexR在执行“new B()”时调用构造函数。没有人说过别的话。反序列化a B时不调用它。请参阅对象序列化规范。