反序列化服务器响应
我想知道是否是反序列化服务器响应的方法。 所以在我的情况下,我有一个LinkedHashMap
并从服务器撤回:
@Override public LinkedHashMap testHMap() { LinkedHashMap map = new LinkedHashMap(); map.put("AA", new Date()); map.put("BB", new Date()); return map; }
我正在尝试获取有关另一个应用程序(gwt)的信息,因此我只能通过HTTP执行调用,而从上面的示例中,HTTP响应看起来像: //OK['WM577vZ',4,5,2,'WM577vZ',4,3,2,2,0,1,["java.util.LinkedHashMap/3008245022","java.lang.String/2004016611","AA","java.util.Date/3385151746","BB"],0,7]
那么,有没有办法从这个HTTP respone获取LinkedHashMap数据?
LinkedHashMap在该响应中 – 该响应是一个对象流(即代替JSON,如果相同的值出现两次,它将只被序列化一次,这使得内容更小,并且还允许循环引用而不是仅仅是一个平面树)。
读取RPC有效负载是“向后” – 从结束开始并向后读取,我们从7(版本)开始,0(设置的标志),一个大的[]
字符串(“字符串表”,解码回复所需的字符串,以便每个字符串只列出一次)。
然后1
– 流中的第一个对象是字符串表中第一个条目的类型,即您正在寻找的"java.util.LinkedHashMap/3008245022"
。 要解码LinkedHashMap,我们首先需要知道它是如何排序的 – 下一个0
值告诉我们它使用默认的“inserted-order”,然后接下来的2
表示地图中有两个条目。
现在我们迭代,直到我们看到两对键和值。 下一个值将告诉我们我们正在看什么样的键: 2
表示进入字符串表,我们看到"java.lang.String/2004016611"
,所以我们知道它将是一个字符串,然后3
显示我们"AA"
也来自字符串表。 接下来是4
,该键的值的类型,可以预测来自字符串表的这个"java.util.Date/3385151746"
。 为了反序列化一个日期,我们从有效载荷读取一个long
– GWT base64编码这些以保持它们更小 – 这是'WM577vZ'
,下一个标记。
接下来的4个标记( 'WM577vZ'
和'WM577vZ'
)重复此过程,将第二个字符串键添加到地图中,并为其添加日期值。
–
这种特殊的有效载荷不是那种真正显示RPCfunction的有效载荷,但手动阅读相当简单。 在GWT应用程序之外对它们进行解码目前并不是很容易(虽然我正在研究一种通用工具,它应该可以在任何地方进行解码,但SO答案实际上并不是讨论它的地方) – 如果你想要一个可以通过普通JS或其他非GWT技术处理的格式,RPC可能不是您目前最好的选择。
我想你正在寻找像restyGWT这样的东西。
但我真的不明白你的问题,所以我可能错了。
- GWT + ProcessBuilder
- 如何创建开发/调试和生产设置
- 使用GWT时找不到Firebase服务工作者(404错误)
- 将多个GWT应用程序集成到可插拔平台中
- 将类名添加到uibinder xml文件中的元素
- GWT中IsSerializable接口的用途是什么(关于RPC机制)
- 使用Google Web Toolkit启动Maven项目的Eclipse配置
- 无法使用gwt读取word和pdf文件
- NoSuchMethodError:org.apache.http.conn.scheme.Scheme。(Ljava / lang / String; ILorg / apache / http / conn / scheme / SchemeSocketFactory;)V