Переходные поля становятся нулевыми после десериализации?

В настоящее время я использую встроенный сериализатор 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
    }
}
Другие вопросы по тегам