在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时不调用它。请参阅对象序列化规范。