Пользовательский Gson Serializer для анонимных классов - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь предоставить универсальный экземпляр "Json Serializer" Gson, который я могу использовать в своей кодовой базе, и мне мешает возможность "только сериализации собственных свойств" в Gson.

У меня естьполучил некоторый код, который по существу сводится к:

public static void main(String[] args) {
    final Set<Integer> union = Sets.union(
        ImmutableSet.of(1, 2), 
        ImmutableSet.of(2, 3)
    );

    final Gson gson = new Gson();
    final JsonElement obj = gson.toJsonTree(union);
    System.out.println("is null: " + JsonNull.INSTANCE.equals(obj));
}
is null: true

Похоже, реализация Sets.union создает анонимный SetView.Я думал, что смогу зарегистрировать JsonSerializer для обработки всех значений SetView, но Gson не использует мой сериализатор:

public static void main(String[] args) {
    final Set<Integer> union = Sets.union(
            ImmutableSet.of(1, 2),
            ImmutableSet.of(2, 3)
    );


    final Gson gson = new GsonBuilder()
            .registerTypeAdapter(Sets.SetView.class, new ViewSerializer())
            .create();
    System.out.println("is SetView: " + (union instanceof Sets.SetView));
    final JsonElement obj = gson.toJsonTree(union);
    System.out.println("is null: " + JsonNull.INSTANCE.equals(obj));
}

private static class ViewSerializer implements JsonSerializer<Sets.SetView<?>> {
    @Override
    public JsonElement serialize(final Sets.SetView<?> src, 
                                 final Type typeOfSrc,
                                 final JsonSerializationContext context) {
        System.out.println("I'm being called, hooray!");
        return context.serialize(src.immutableCopy());
    }
}
is SetView: true
is null: true

Мой пользовательский сериализатор никогда не вызывается.Есть ли другой способ, которым я должен был бы зарегистрировать это в Gson?

Я знаю, что я мог бы просто изменить свой код на

final JsonElement obj = gson.toJsonTree(union.immutableCopy());

, но я бы предпочелизменить код моей библиотеки (который используется везде).Нереально думать, что все в моей компании могут постоянно следить за методами, которые могут возвращать анонимную реализацию класса Collections.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...