Переходные поля становятся нулевыми после десериализации?
В настоящее время я использую встроенный сериализатор JAVA java.io.Serializable
и не могу заставить его десериализоваться и установить для моих полей значения по умолчанию. Я даже пытался использовать 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 расширяет Serializable
ТОЛЬКО состояние времени равно нулю после десериализации файла. Он НЕ МОЖЕТ быть установлен равным нулю через любого из мутаторов.
1 ответ
Решение
Просто используйте 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
}
}