Gson десериализует полиморфный список: Gson не находит правильный подтип - PullRequest
0 голосов
/ 19 мая 2019

Я хочу сохранить список полиморфных объектов, и я использую класс 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?

Я следил эта статья , так я что-то пропустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...