【问题标题】:JSON deserializing issues when using both GAE Endpoints and GCM on Android在 Android 上同时使用 GAE 端点和 GCM 时出现 JSON 反序列化问题
【发布时间】:2013-06-15 08:45:27
【问题描述】:

我有一个 GAE/J 服务器,它通过端点与我的 Android 客户端通信。

有时我会通过 GCM 向客户端发送一个实例,而不是让客户端通过端点请求它。在这种情况下,我需要自己进行 JSON 序列化/反序列化,而不是让端点为我做这件事。

这在客户端上尤其混乱。我想反序列化到由端点生成的类中,这样我就可以使用相同的代码来处理新数据,而不管我是通过端点还是通过 GCM 接收到的。

我认为一种解决方案是将代码添加到客户端上生成的类(例如从生成的类继承),但我发现该类是最终的并且所有成员都是私有的,因此使用它很尴尬。 我不认为我可以在注释中设置任何内容来改变这一点?

另一种解决方案是使用 Google java 客户端库反序列化到生成的类中,就像端点一样。不幸的是,在我看来,该库同样不灵活:我必须将 GCM 数据放入 HttpResponse 对象中,以便调用 HttpResponse.parseAs(MyGeneratedClass.class)。

有没有办法利用 Java 客户端库的 JSON 反序列化代码(以便反序列化为具有 @Key 注释的生成类),它与 HTTP 请求/响应代码更加分离?

【问题讨论】:

  • 我在这里创建了一个相关请求:code.google.com/p/google-plugin-for-eclipse/issues/…
  • 您是否反对通过 GCM 发送的消息是通知有对象准备好通过应用程序请求?
  • @DanHolevoet 是的,我可以这样做,但现在 GCM 接受有效负载(假设我的数据小于 4K 有效负载大小限制)似乎很浪费。

标签: android json google-api-java-client google-cloud-endpoints


【解决方案1】:

以下是从这个问题中得出的可能解决方案的摘要。

我输入了一个针对 Google API java 客户端的问题: “Google Cloud Endpoints 生成的 Java 类不应该是最终的” https://code.google.com/p/google-api-java-client/issues/detail?id=802

这已被接受,针对版本 1.16.0。

所以一种解决方案是编写一个封装生成类的类,然后在 1.16 发布时将我的类重构为生成类的子类。

另一个解决方案来自@loosebazooka,他指出 Google API 客户端库实际上包含 GSON 库的副本 - 恰好与生成的类中的 json 注释一起使用。这使它成为对生成的类进行自己的 JSON 处理的一种非常方便的方法。

我认为这是一个很好的解决方案(因此我将其标记为已接受),但我对自己使用它感到犹豫,因为这会使我的应用程序中的不同 JSON 库的数量增加到 4 个。我已经在使用的 3 个是:

  1. 我开始使用 org.json,因为它从一开始就与 Android 一起提供。 (我相信 Android 在 API 11 中添加了另一个用于流式传输的 JSON 库)。
  2. 默认情况下,端点将 Jackson 用于 JSON。
  3. 当我开始使用 Playstore API 支持端点身份验证时,我不得不添加 json.simple。

也许可以更改生成的端点代码以使用内部 GSON,这样添加它就不会增加冗余库的数量?

【讨论】:

  • 现在预计删除 final 关键字的更改适用于 r17 而不是 google api java 库的 r16。
【解决方案2】:

生成的客户端库设置有注释,以使用 GsonFactory 的 fromString() 函数进行反序列化。注意在服务器端如何序列化,使其与在客户端使用注释进行反序列化的方式兼容(可能在服务器端使用具有相同注释的 GsonFactory toString())

【讨论】:

  • 生成的客户端库设置有用于 Java 的 Google API 客户端客户端库的注释。特别是,他们使用“@com.google.api.client.util.Key”注解。我意识到我可以将 GSON 用作 GACCL4J 的插件,但你是说 GSON 会自己识别这些 @Key 注释,所以我可以直接使用 GSON?
  • 我相信@Key只是表示json文件中使用的密钥,忽略它将使该字段无法序列化。这些文档很好地了解了密钥的用途(因为您还没有看到它们):javadoc.google-api-java-client.googlecode.com/hg/1.0.10-alpha/… Google Java 客户端库中有一个 GsonFactory(JsonFactory 的实现),它基于这些注释进行序列化和反序列化.据我所知,标准 Gson 不使用它们。
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多