Я пытаюсь предоставить универсальный экземпляр "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.