如何使用 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 并尝试找出什么类型应该是的,但是这个逻辑要难得多。
我知道这是一个常见问题,但在搜索了两个小时后,我在这里问是否有解决方案。我需要实现一个第三方接口来序列化和反序列化 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 并尝试找出什么类型应该是的,但是这个逻辑要难得多。