gpt4 book ai didi

java - 反序列化后 transient 字段变为空?

转载 作者:行者123 更新时间:2023-12-02 04:04:01 28 4
gpt4 key购买 nike

我目前正在使用 JAVA 的内置序列化程序 java.io.Serialized,但似乎无法让它反序列化并将我的字段设置为其默认值。我什至尝试使用 readObject 来初始化字段,但它不起作用。

这是我的代码:

public abstract class BossQuest implements Quest, 
Listenable { //Quest(interface) extends Serializable

private transient Status status = Status.IDLE; //This does not work

private String name;

public BossQuest(String name) {
this.name = name;
initialize();
}

//This also does not work
public BossQuest() {
this.status = Status.IDLE;
}

//This was my hacky attempt to forcefully set default values (Does not work)
public void initialize() {
status = Status.IDLE;
}

private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject();
initialize();
}

public Status getStatus() {
System.out.print("Requesting status!");

if (status == null) {
System.out.print("Status is.. null..?");
}

System.out.print(status);

return status;
}
}

在我上面的代码中,Quest 扩展了 Serialized

唯一一次状态为空是在我反序列化文件之后。不能通过任何修改器将其设置为 null。

最佳答案

只需使用readResolve()将状态初始化为IDLE即可。

这是一个完整的示例:

public class BossQuest implements Serializable {
private String name;
private transient int status = 42;

public BossQuest(String name) {
this.name = name;
}

public String getName() {
return name;
}

public int getStatus() {
return status;
}

public void setStatus(int status) {
this.status = status;
}

private Object readResolve() {
this.status = 42;
return this;
}

public static void main(String[] args) throws IOException, ClassNotFoundException {
BossQuest in = new BossQuest("test");
in.setStatus(987);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(in);
oos.close();

byte[] b = baos.toByteArray();

ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(b));
BossQuest out = (BossQuest) ois.readObject();
System.out.println(out.getName()); // prints test
System.out.println(out.getStatus()); // prints 42
}
}

关于java - 反序列化后 transient 字段变为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34555137/

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