GSON 无法正确序列化扩展 HashMap 的类

2024-05-14

我有以下代码:

public static class A
{
    public A() {}
    private List<B> bs = new ArrayList<B>();
    public List<B> getBs() {
        return bs;
    }
    public void setBs(List<B> bs) {
        this.bs = bs;
    }
}

public static class B
{
    B(String foo){this.foo=foo;}
    private String foo;
    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
}

public static void main(String[] args) throws Exception {
    Gson gson = new Gson();
    A a = new A();
    a.getBs().add(new B("bar"));
    System.out.println(gson.toJson(a));
}

正如预期的那样,输出是:

{"bs":[{"foo":"bar"}]}

但是,如果我将 A 设为 HashMap 的子类:

public static class A extends HashMap

我收到一个空集返回:{}

我什至尝试过:

System.out.println(gson.toJson(a, new TypeToken<A>(){}.getType()));

and:

System.out.println(gson.toJson(a, new TypeToken<HashMap>(){}.getType()));

有人可以告诉我是否/如何使用 GSON 序列化这个 HashMap 子类?


Gson 可以使用(默认和自定义)TypeAdapterFactory实例和TypeAdapter他们创建的对象用于序列化/反序列化您的对象。

它会遍历注册列表TypeAdapterFactory对象并选择第一个可以创建合适的对象TypeAdapter对于您提供的对象的类型。其中之一TypeAdapterFactory对象,是类型之一MapTypeAdapterFactory这创建了一个TypeAdapter(类型MapTypeAdapterFactory$Adapter)基于序列化/反序列化java.util.Map接口(键/值)。它对您的自定义子类型的字段没有任何作用。

如果您希望 Gson 将您的类型序列化为Map和自定义类型,您将需要注册一个自定义TypeAdapter直接或自定义TypeAdapterFactory创造了TypeAdapter对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GSON 无法正确序列化扩展 HashMap 的类 的相关文章

随机推荐