gpt4 book ai didi

java - 在反洗过程中读回自定义 readObject 中的最终值?

转载 作者:搜寻专家 更新时间:2023-11-01 03:24:26 30 4
gpt4 key购买 nike

假设我正在为我的类定义一个自定义的 writeObjectreadObject 用于序列化目的。该类具有在构造函数中初始化的最终属性 (int)。在 writeObject 期间没有问题。但是在读回对象时,我无法将值分配给属性,因为编译器提示我无法覆盖 final 属性并要求我从属性中删除 final 修饰符。有解决办法吗?

下课可能会让您清楚地了解我正在努力实现的目标。 this.age = in.readInt();readObject() 中给我编译错误。

public class Person {

private String name = null;
private final int age;

public Person(String name, int age)
{
this.name = name;
this.age = age;
}

public void writeObject(ObjectOutputStream out) throws IOException
{
out.writeObject(name);
out.writeInt(age);
}

public void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
this.name = (String) in.readObject();
this.age = in.readInt();
}

}

最佳答案

默认的 ObjectInputStream 反序列化似乎使用 sun.misc.Unsafe 来设置字段 (java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(Object, Object[ ])) 所以设置一个 final 字段可能不是你想要做的事情。正如 Katona 在评论中建议的那样,您可以改为执行以下操作:

public class Person implements Serializable {

private String name = null;

private final int age;

private int ageFromRead;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(name);
out.writeInt(age);
}

private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
this.name = (String) in.readObject();
this.ageFromRead = in.readInt();
}

private Object readResolve() {
return new Person(name, ageFromRead);
}
}

关于java - 在反洗过程中读回自定义 readObject 中的最终值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18538484/

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