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 шт):
Вы путаете JsonReader и Gson - это два разных парсера. Чтобы спарсить с помощью Gson надо сделать примерно так:
TimerTaskTime timerTask = GlobalVar.GSON.fromJson(new FileReader("json.json"), TimerTaskTime.class);
JsonReader здесь не причем.
