Метод сериализации Gson не вызывается

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

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

person giampaolo    schedule 25.11.2013
comment
Я пытаюсь сериализовать не перечисления, а классы. Перечисления здесь используются только для хранения всех сериализаторов в одном месте. - person KotuS; 28.11.2013
comment
Не могли бы вы также добавить остальную часть кода, чтобы я мог лучше понять, что вы пытаетесь сделать? - person giampaolo; 28.11.2013