gpt4 book ai didi

java - 反序列化是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:37 24 4
gpt4 key购买 nike

据我所知,不会调用其对象被序列化的类的构造函数,而是调用第一个不可序列化构造函数的无参数构造函数。现在考虑以下代码

public class SerializeDemo implements Serializable {

private String name;
int age; //default 0

public SerializeDemo(String name, boolean setAge){
this.name = name;
if(setAge){
this.age = 18;
}
}

@Override
public String toString() {
return "Name is " + name + " and age is " + age;
}

public static void main(String args[]) throws IOException, ClassNotFoundException {

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("//home//aniket//Desktop//serializedObjects.txt")));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("//home//aniket//Desktop//serializedObjects.txt")));
SerializeDemo sd = new SerializeDemo("Test",true);
System.out.println("Before Serialization : " + sd);
oos.writeObject(sd);
SerializeDemo sdCopy = (SerializeDemo)ois.readObject();
System.out.println("After Deserialization : " + sdCopy);
}
}

并且输出是(如预期的那样)

Before Serialization : Name is Test and age is 18
After Deserialization : Name is Test and age is 18

现在具有无参数构造函数的不可序列化父类(super class)是对象(如果我错了请纠正我)。所以基本上没有调用 SerializeDemo 构造函数。

现在,当在反序列化过程中创建对象时,它将尝试重建实例状态。所以它将年龄设置为 18。

问题是如何?

我故意不提供二传手。也没有按照上面的讨论调用它的构造函数。那么它是如何设置的呢?(名字也一样)

最佳答案

您可以查看ObjectInputStream 源代码。它使用反射,它创建一个对象,从流中读取字段,并使用反射设置对象的字段。您可以在调试器中运行您的代码,并逐步精确到设置年龄的那一行。

关于java - 反序列化是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20966204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com