2013-11-25 5 views
1

Я пытаюсь выполнить сериализацию своих объектов обратно в JSON с помощью Google Gson, используя интерфейс JsonSerializer, и, хотя десериализация работает очень хорошо, сериализация не вызывает метод сериализации.Метод сериализации Gson не называется

Serializer/десериализации классов

public enum JsonParser implements JsonDeserializer<Object>, JsonSerializer<Object> { 
    LANGUAGE(Language.class) { 
     @Override 
     public Language deserialize(JsonElement elem, Type type, JsonDeserializationContext context) { 
      return Language.valueOf(elem.getAsString()); 
     } 

     @Override 
     public JsonElement serialize(Object object, Type type, JsonSerializationContext context) { 
      return new JsonPrimitive(((Language) object).getCode()); 
     } 
    }, 
    DATA_TYPE(DataType.class) { 
     @Override 
     public DataType deserialize(JsonElement elem, Type type, JsonDeserializationContext context) { 
      return DataType.getByIdentifier(elem.getAsString()); 
     } 

     @Override 
     public JsonElement serialize(Object object, Type type, JsonSerializationContext context) { 
      System.out.println("test"); 
      return new JsonPrimitive(((DataType) object).getIdentifier()); 
     } 
    }; 

    private final Class clazz; 
    JsonParser(Class clazz) { 
     this.clazz = clazz; 
    } 

    public Class getParserClass() { 
     return clazz; 
    } 
} 

и испытания:

GsonBuilder gsonBuilder = new GsonBuilder(); 
    for(JsonParser jp : JsonParser.values()) 
     gsonBuilder.registerTypeAdapter(jp.getParserClass(), jp); 
    Gson gson = gsonBuilder.create(); 

    String json = "{\"type1\":{\"da\":\"Some string\",\"pt_BR\":\"More strings\",\"pl\":\"String 3\",\"eo\":\"String 4\"},\"type2\":{\"pl\":\"String 5\",\"pt_BR\":\"String 6\",\"ru\":\"String 7\"}}"; 
    Map<DataType, Map<Language, String>> map = gson.fromJson(json, new TypeToken<Map<DataType, Map<Language, String>>>(){}.getType()); 
    System.out.println(map); 
    System.out.println(gson.toJson(map)); 

Хотя fromJson() возвращает правильные объекты, toJSON() использует по умолчанию ToString() из объектов вместо методов, указанных в serialize().

Похоже, что сериализатор по какой-либо причине не регистрируется (тестовая распечатка не отображается).

Спасибо за любые предложения.

+0

получить поездку в сериализаторе и все должно работать правильно – rpax

ответ

0

Gson будет использовать EnumTypeAdapter для десериализации вашего перечисления, поскольку, если бы я правильно понял внутренности Gson, этот тип адаптера будет вызываться раньше, чем отражающий, который использует вместо этого материал сериализации.

Этот question будет обратиться к вам, как вы можете изменить формат JSON сериализацию вашего перечисления (используя TypeAdapter)

+0

Это не Перечисление Я пытаюсь сериализации, но классы , Перечисления здесь используются только для того, чтобы сохранить все сериализаторы в одном месте. – KotuS

+0

Не могли бы вы также оставить остальную часть кода, чтобы я мог лучше понять, что вы пытаетесь сделать? – giampaolo

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