在反序列化过程中如何获取字段值?

时间:2014-01-30 15:24:16

标签: 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+""+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但是当我implement serializable in B上课时,结果为345

我无法理解B类序列化的差异......

1 个答案:

答案 0 :(得分:3)

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

因此,当您的班级B未实施Serializable时,构造函数会运行,并将7分配给x,因此您获得745 。但是,当它实现Serializable时,这不会发生,并且x的值将是它在序列化对象时的值,即在这种情况下为3