Методът за сериализиране на Gson не се извиква

Опитвам се да сериализирам обектите си обратно в JSON, използвайки Gson на Google, използвайки интерфейс JsonSerializer и докато десериализацията работи добре, сериализацията не извиква метода за сериализиране.

Класове на сериализатор / десериализатор

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().

Изглежда, че сериализаторът не се регистрира по някаква причина (тестовата разпечатка не се показва).

Благодаря за всякакви предложения.


person KotuS    schedule 25.11.2013    source източник
comment
отървете се от сериализатора и всичко трябва да работи правилно   -  person rpax    schedule 28.02.2014


Отговори (1)


Gson ще използва EnumTypeAdapter, за да десериализира вашето enum, тъй като, ако разбрах правилно вътрешността на Gson, този тип адаптер ще бъде извикан преди отразяващия, който използва вместо това вашите сериализаторски неща.

Този въпрос ще ви отговори как можете да промените JSON сериализацията на вашият enum (с помощта на TypeAdapter)

person giampaolo    schedule 25.11.2013
comment
Опитвам се да сериализирам не enums, а класове. Енумите тук се използват само за запазване на всички сериализатори на едно място. - person KotuS; 28.11.2013
comment
Бихте ли любезно поставили и останалата част от кода, за да мога да разбера по-добре какво се опитвате да направите? - person giampaolo; 28.11.2013