Как десериализовать сложные классы с несколькими уровнями полиморфизма с помощью GSON - PullRequest
0 голосов
/ 09 октября 2019

Я просмотрел множество вопросов GSON о десериализации интерфейсов, производном классе и т. Д. И нашел несколько хороших ответов.

Я недавно начал работать с некоторым унаследованным кодом, который содержит множество сложных сообщений. Коротким примером может быть:

public abstract class Message implements Serializable {
    private final String messageSourceName;
    protected Message(String mSN) {this.messageSourceName = mSN;}
}
public static abstract class EmployeeMessage extends Message {
    EmployeeMessage(String sourceName, CustomClass1 cc1, CustomClass2){
       super(sourceName);
       this.customClass1 = cc1;
       this.customClass2 = cc2;
    }
}
public static class TeacherMessage extends EmployeeMessage {
    public TeacherMessage(String sourceName, CustomClass1 cc1, 
                          CustomClass2 cc2, CustomClass3 cc3){
        super(sourceName, CustomClass1 cc1, CustomClass2 cc2);
        this.customClass3 = cc3;
    }
} 

Итак, в настоящее время я пытаюсь сериализовать и десериализовать класс TeacherMessage, и я видел ответы, посвященные решению аналогичных проблем в Интернете, таких как настраиваемая сериализация и десериализация. и InstanceCreators. Тем не менее, дополнительная проблема заключается в том, что многие из этих «CustomClasses» не имеют конструкторов по умолчанию без аргументов, что приводит к ошибке при десериализации.

Мой вопрос: как лучше всего подойти к этой проблеме? Нужно ли создавать InstanceCreators для всех пользовательских классов в сообщениях? И будут ли пользовательские сериализации / десериализации использоваться для уровня сообщений или уровня EmployeeMessage?

...