Я использую Gson, чтобы сохранить мои классы обратно совместимым способом. У меня есть следующий класс singleton, который я пытаюсь сделать сериализацией.Сериализация и десериализация вложенных классов
public class DataHandler implements Serializable {
private static DataHandler instance; //SINGLETON
private HashMap<FormIdentification, BaseForm> forms =
new HashMap<FormIdentification, BaseForm>();
public void read(){
//read the json string
Gson gson = new Gson();
instance = gson.fromJson(json, DataHandler.class);
}
public void write(){
Gson gson = new Gson();
String json = gson.toJson(instance);
//write the json string
}
}
public class FormIdentification implements Serializable{
public String name, type;
byte[] id;
public FormIdentification(String name, String type, byte[] id) {
this.name = name;
this.type = type;
this.id = id;
}
}
public abstract class BaseForm implements Serializable{
protected FormIdentification identity;
protected final List<BaseQuestion> questions = new ArrayList<BaseQuestion>();
protected final HashMap<String, List<String>> personalData = new HashMap<String, List<String>>();
}
public class LinearForm extends BaseForm {
private DefaultMutableTreeNode criteria;
}
public abstract class BaseQuestion implements Serializable{
protected String question;
protected List<String> possibleAnswers;
}
Он упорядочивает к следующему JSON:
{
"forms":{
"[email protected]":{
"criteria":{
"allowsChildren":true
},
"identity":{
"name":"Mircea",
"type":"linear",
"id":[
111,
119
]
},
"questions":[
],
"personalData":{
"Nume":[
]
}
}
}
}
JSON полно и все данные о том, что классы, содержащиеся, когда он был создан. Но когда я пытаюсь десериализации это дает следующее сообщение об ошибке:
SEVERE: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 12
Заметьте, что это был компактный отформатирован, поэтому строка 1 колонка 12 должна быть: { «формы»: { «test.Structures ...»
Я новичок в json, поэтому начал искать решение, но я его не нашел. Я попробовал кастинг с помощью TypeToken, и я изучил возможность создания пользовательского сериализатора, но этого не удалось. Я также попробовал сериализовать только переменные «формы», но он дает ту же ошибку.
Вы должны указать свой код. Не размещайте его как ссылки, которые могут умереть в течение некоторого времени, делая ваш вопрос невозможным для понимания. – Pshemo
@Pshemo Спасибо за ваше предложение. Я сделал так, как ты сказал. – mmimaa