如何使用 Gson 反序列化通用对象 "T"?

How do I deserialize generic object "T" with Gson?

我知道这是一个常见问题,但在搜索了两个小时后,我在这里问是否有解决方案。我需要实现一个第三方接口来序列化和反序列化 Android 应用程序中的对象。我想使用 Gson 来实现这一点。 方法如下:

@Override
public byte[] serialize(Object object) throws IOException {
    return new Gson().toJson(object).getBytes();
}

@Override
public <T extends Job> T deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
    // problem here
}

我不能使用这样的东西:

gson.fromJson(responseBody, new TypeToken<T>() {}.getType());

因为它 returns 类型为 LinkedTreeMap 的对象。 Gson需要对象的Class,而我只有这个T(我来自.net世界,泛型比较多"developer friendly")。

在这种情况下是否可以获得T的原始class?

正如您已经在评论中讨论的那样,Gson 不可能非常出色并弄清楚原始对象是什么。如果您花 5 分钟思考这将如何工作,您就会意识到这是不可能的。

但是,您可以在 自定义 反序列化器中分析 Json 并找出它应该是什么类型。 Gson 已经有 RuntimeTypeAdapterFactory for this. See this discussion for a working example:

基本上,您可以使用此工厂在 json 本身中指定类型,(它看起来像 "type":"typename",这将使您可以进行反序列化。

如果修改 json 不是一个选项,您可以 仍然 编写自定义反序列化程序来分析 json 并尝试找出什么类型应该是的,但是这个逻辑要难得多。