0

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

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

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

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

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

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

4

2 回答 2

1

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

于 2013-06-19T21:22:55.730 回答
0

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

我针对 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,这样添加它就不会增加冗余库的数量?

于 2013-06-20T23:31:06.433 回答