Java 匿名类的自定义Gson序列化程序

Java 匿名类的自定义Gson序列化程序,java,json,gson,Java,Json,Gson,我试图提供一个通用的Gson“Json序列化器”实例,我可以在整个代码库中使用它,而Gson的“只序列化自己的属性”特性正在阻碍我 我有一些代码,基本上可以归结为: public static void main(String[] args) { final Set<Integer> union = Sets.union( ImmutableSet.of(1, 2), ImmutableSet.of(2, 3) ); fin

我试图提供一个通用的Gson“Json序列化器”实例,我可以在整个代码库中使用它,而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));
}
看起来
set.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());
    }
}
从未调用我的自定义序列化程序。是否有其他方式可以让我向Gson注册

我知道我可以简单地将代码更改为

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

但是我更愿意更改我的库代码(它在任何地方都被使用)。认为我们公司的每个人都可以对可能返回集合类匿名实现的方法保持警惕是不现实的。

您也可以调用
gson.toJsonTree(union,Set.class)。您无法注册优先于Gson内部适配器的适配器,该适配器排除了匿名类.Dang。这并不是一个很好的选择,序列化程序应该是非常通用的。我想如果我发现一个匿名类,我可以遍历对象树并抛出,这样我的团队至少知道如何修复他们的代码…作为一个功能请求添加到Gson:尽管我看到他们过去已经关闭了类似的请求。你也可以调用
Gson.toJsonTree(union,Set.class)。您无法注册优先于Gson内部适配器的适配器,该适配器排除了匿名类.Dang。这并不是一个很好的选择,序列化程序应该是非常通用的。如果我发现一个匿名类,我想我可以遍历对象树并抛出,这样我的团队至少知道如何修复他们的代码…作为一个功能请求添加到Gson:尽管我看到他们过去已经关闭了类似的请求。
is SetView: true
is null: true
final JsonElement obj = gson.toJsonTree(union.immutableCopy());