2014-01-25 2 views
0

Я использую 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, и я изучил возможность создания пользовательского сериализатора, но этого не удалось. Я также попробовал сериализовать только переменные «формы», но он дает ту же ошибку.

+0

Вы должны указать свой код. Не размещайте его как ссылки, которые могут умереть в течение некоторого времени, делая ваш вопрос невозможным для понимания. – Pshemo

+0

@Pshemo Спасибо за ваше предложение. Я сделал так, как ты сказал. – mmimaa

ответ

1

Объект JSON представляет собой набор пар ключ/значение. Значения могут быть любым значением JSON: string, number, object, array, true, false или null. Однако ключ в объекте JSON может быть только строкой.

Когда JSON-сериализация Map<FormIdentification, BaseForm>, ваш ключ FormIdentification. Лучший GSON может сделать, это использовать FormIdentification.toString(), чтобы получить строку для ключа.

Однако во время десериализации JSON не существует способа узнать, как получить строку FormIdentification из строки.

+0

Благодарим вас за ответ. Теперь, когда вы это сказали, когда я смотрю на json, мне ясно, почему он не работает. Я переключился на XML, используя xStream, чтобы достичь того же. – mmimaa

+0

Вы можете рассмотреть обычную сериализацию JSON, где ваша карта выражается в виде массива объектов JSON, где у объекта есть ключи 'key' и' value' для выражения каждой пары «Карта»: [{«ключ»: {' сериализованный ключ1'}, «значение»: {'сериализованное значение1'}}, {" ключ ": {' сериализованный ключ2'}, "значение": {'сериализованное значение2'}}, ...] –

+0

Возможно, с помощью адаптера типа http://stackoverflow.com/a/22074145/3315914 – rpax

Смежные вопросы