在Android上同时使用GAE端点和GCM时,JSON反序列化问题

时间:2013-06-18 23:32:50

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

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

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

这对客户来说特别麻烦。我想反序列化到由端点生成的类,这样我就可以使用相同的代码来处理新数据,无论我是通过端点还是通过GCM接收它。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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处理非常方便。

我认为这是一个很好的解决方案(因此我将其标记为已接受)但我自己也犹豫不决,因为这会在我的应用中带来4个不同的JSON库。我已经使用的3个是:

  1. 我开始使用org.json,因为它从一开始就是Android。 (我相信Android在API 11中为流媒体添加了另一个JSON库。)
  2. 默认情况下,端点使用Jackson for JSON。
  3. 当我开始使用Playstore API支持端点身份验证时,我不得不添加json.simple。
  4. 也许有人可以更改生成的端点代码以使用内部GSON,这样添加它就不会增加冗余库的数量?