反序列化服务器响应

时间:2018-05-07 09:44:33

标签: java http gwt

我想知道是否是反序列化服务器响应的方法。所以在我的情况下,我有一个LinkedHashMap<String,Date>并从服务器上撤回:

 @Override
    public LinkedHashMap<String, Date> testHMap() {
        LinkedHashMap<String, Date> 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数据?

2 个答案:

答案 0 :(得分:4)

LinkedHashMap位于该响应中 - 该响应是一个对象流(即代替JSON,如果相同的值出现两次,它将只被序列化一次,这使得内容更小,并且还允许循环引用而不是只有一棵扁树。)

读取RPC有效负载是“向后”完成 - 从结束开始并向后读取,我们从7(版本)开始,0(设置的标志),一个大的[]字符串( “字符串表”,解码答复所需的字符串,这样每个字符串只列出一次。)

然后是1 - 流中的第一个对象是字符串表中第一个条目的类型,即您正在寻找的"java.util.LinkedHashMap/3008245022"。要解码LinkedHashMap,我们首先需要知道它是如何排序的 - 下一个0值告诉我们它使用默认的“插入顺序”,然后下一个2表示有地图中的两个条目。

现在我们迭代,直到我们看到两对键和值。下一个值将告诉我们我们正在查看哪种密钥:2表示进入字符串表,我们看到"java.lang.String/2004016611",因此我们知道它将是一个字符串,然后是{{ 1}}也从字符串表中向我们显示3。接下来是"AA",该键的值的类型,可预测来自字符串表中的4。为了反序列化日期,我们从有效载荷中读取"java.util.Date/3385151746" - GWT base64编码这些以保持它们更小 - 这是long,下一个标记。

接下来的4个令牌('WM577vZ'254)重复此过程,将第二个字符串键添加到地图中,并添加日期它的价值。

-

这种特殊的有效载荷并不是真正显示RPC功能的那种,但手动阅读相当简单。将它们解码到GWT应用程序之外目前并不是很容易(虽然我正在研究一种通用工具,它应该可以在任何地方进行解码,但是SO答案实际上不是讨论它的地方) - 如果你想要一个可以通过普通JS或其他非GWT技术处理的格式,RPC可能不是您目前最好的选择。

答案 1 :(得分:0)

我认为你正在寻找像restyGWT这样的东西。

但我真的不明白你的问题,所以我可能错了。