Я хочу сохранить список полиморфных объектов, и я использую класс RuntimeTypeAdapterFactory.Базовый класс - Student
(абстрактный), а его подклассы - Undergraduate
, Masters
и PHD
.Вот моя сериализация:
private static final TypeToken STUDENT_SERIAL_TYPE
= new TypeToken<Student>() {
};
private static StudentsDA instance = null;
// Save subclasses (polymorphic) locally
RuntimeTypeAdapterFactory<Student> adapter = RuntimeTypeAdapterFactory
.of(Student.class, "type")
.registerSubtype(Undergraduate.class)
.registerSubtype(Masters.class)
.registerSubtype(PHD.class);
private Gson getGson() {
return new GsonBuilder()
.setPrettyPrinting()
.registerTypeAdapterFactory(adapter)
.create();
}
//....
public void saveStudents(List<Student> students) {
String studentsJson = getGson().toJson(students);
saveStudentsLocally(studentsJson);
}
Что отлично сохраняет, тип зарегистрирован как у меня
public final String type = getClass().getName();
на Student.java
.
Итак, вот моя десериализационная часть:
public List<Student> getStudents() {
JsonParser parser = new JsonParser();
JsonArray stdArray = parser.parse(loadStudentsData()).getAsJsonArray();
List<Student> students = new ArrayList<>();
for (JsonElement jsonElement : stdArray) {
Student s = getGson().fromJson(jsonElement, STUDENT_SERIAL_TYPE.getType());
students.add(s);
}
return students;
}
Но когда я звоню getStudents()
, она выдает эту ошибку:
Exception in thread "AWT-EventQueue-0" com.google.gson.JsonParseException: cannot deserialize class main.models.Student subtype named main.models.Masters; did you forget to register a subtype?
Я следил эта статья , так я что-то пропустил?