GSON не десеарелезует поля объектов в Java

Использую Java 11 и IntelliJ IDEA 2019

Начну с того, что это происходит не со всеми классами. Например, десеарилацзия класса такого вида происходит нормально:

public class TimeWrapper {
    private int time = 0;

    // тут геттеры и сеттеры для time, не буду засорять ими вопрос
}

Если же я пытаюсь десеарелизовать, например, экземпляр такого класса:

public class TimerTaskTime extends ModifiedTimerTask {
    public TimerTaskTime(long period) {
        super(period);
    }

    @Override
    public void run() {
        timeWrapper.setTime(timeWrapper.getTime() + 1);
        System.out.println(">>>>> " + timeWrapper.getTime());
    }
}
public abstract class ModifiedTimerTask extends TimerTask {
    private long currentTimeMillis;
    private long launchTimeMillis;
    private long periodMillis;

    public ModifiedTimerTask(long periodMillis) {
        setPeriodMillis(periodMillis);
    }

    // тут геттеры и сеттеры всех полей этого класса, не буду засорять ими вопрос
}

то ничего не десеарилизуется. Все поля объекта остаются со стандартными значениями, хотя при сериализации объект был сериализован как:

{
  "value": {
    "currentTimeMillis": 1603871358784,
    "launchTimeMillis": 1603871358210,
    "periodMillis": 1000,
    "lock": {},
    "state": 1,
    "nextExecutionTime": 1603871359210,
    "period": -1000
  }
}

Попытался найти ответ в других вопросах стековерфлоу, но нашел там лишь совет "возможно у вас не совпадают имена сериализованных полей и полей объекта". Как видно, имена сходятся(хотя у геттеров и сеттеров у всех полей у которых 2 слова или более, поля с большой буквы, например getPeriodMillis())

Я сериализую объекты так:

// все объекты записываются поочередно в json.json в корневой папке проекта
FileWriter fileWriter = new FileWriter("json.json");
// GlobalVar.GSON хранит объект Gson; timerTaskTime хранит в себе TimerTaskTime, описанный ранее
GlobalVar.GSON.toJson(timerTaskTime, fileWriter);
// ...сериализация других объектов...

Я десеарелизую объекты так:

JsonReader fileReader = new JsonReader(new FileReader("json.json"));
// set() потому что timerTaskTime хранит AtomicReference на TimerTaskTime
timerTaskTime.set(GlobalVar.GSON.fromJson(fileReader, TimerTaskTime.class));
// ...десеарилазция прочих объектов...

Так вот сам вопрос. Что не так? Почему объект десеарилизуется с пустыми полями?

десеарилзованный с пустыми полями объект


Ответы (1 шт):

Автор решения: Barmaley

Вы путаете JsonReader и Gson - это два разных парсера. Чтобы спарсить с помощью Gson надо сделать примерно так:

 TimerTaskTime timerTask = GlobalVar.GSON.fromJson(new FileReader("json.json"), TimerTaskTime.class);

JsonReader здесь не причем.

→ Ссылка