【问题标题】:How do I deserialize generic object "T" with Gson?如何使用 Gson 反序列化通用对象“T”?
【发布时间】:2015-09-02 20:41:06
【问题描述】:

我知道这是一个常见问题,但在搜索了两个小时后,我在这里询问是否有解决方案。我需要实现一个第三方接口来序列化和反序列化 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());

因为它返回一个LinkedTreeMap 类型的对象。 Gson 需要对象的 Class,但我只有这个 T(我来自 .net 世界,泛型对开发人员更友好)。

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

【问题讨论】:

  • 不太可能。你可以做的是让TypeToken 成为deserialize 的另一个参数,并强制deserialize 的调用者声明他们期望的类型。否则,不行,你不能用 Gson 反序列化一个未知类型的对象。
  • 我明白了。不幸的是,我既不能改变方法签名也不能改变调用者。还是谢谢。
  • 那你……差不多是 SOL。您需要具体说明您期望的对象类型。

标签: java android generics gson


【解决方案1】:

正如您已经在 cmets 中讨论过的,Gson 不可能非常出色并弄清楚原始物体是什么。如果您花 5 分钟时间思考这将如何发挥作用,您就会意识到这是不可能的。

但是,您可以在 custom 反序列化程序中分析 Json 并找出它应该是什么类型。 Gson 已经为此提供了RuntimeTypeAdapterFactory。请参阅此讨论以获取工作示例:https://stackoverflow.com/a/22081826/1768232

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

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

【讨论】:

  • 嗯,谢谢!这可能是一个解决方案,我可以用 json 做我想做的事。我会尽快尝试。
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多