反序列化服务器响应

Bor*_*lae 1 java gwt http

我想知道是否是反序列化服务器响应的方法。所以在我的情况下,我有一个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;
    }
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取有关另一个应用程序 (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 响应中获取 LinkedHashMap 数据?

Col*_*rth 6

LinkedHashMap 就在那个响应中——那个响应是一个对象流(即代替 JSON,如果相同的值出现两次,它只会被序列化一次,这让内容更小,并且还允许循环引用而不是只有一个平面树)。

读取 RPC 负载是“向后”完成的——从末尾开始向后读取,我们从 7(版本)、0(设置的标志)、[]一大串字符串(“字符串表”,即需要解码回复,因此每个字符串只列出一次)。

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

现在我们迭代直到我们看到两对键和值。下一个值将告诉我们我们正在查看什么样的键:2意味着进入字符串表,我们看到"java.lang.String/2004016611",所以我们知道它将是一个字符串,然后也从字符串表中3向我们显示"AA"。接下来是4该键的值的类型,可以"java.util.Date/3385151746"从字符串表中预测。为了反序列化一个日期,我们long从有效载荷中读取 a - GWT base64-encodes 这些以保持它们更小 - 这是'WM577vZ'下一个令牌。

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

——

这种特殊的有效载荷并不是真正显示 RPC 威力的那种,但手动读取相当简单。在 GWT 应用程序之外解码它们目前不是很容易(虽然我正在开发一个通用工具,它应该让它在任何地方解码,但 SO 答案并不是真正谈论它的地方) - 如果你想要一个可以由普通 JS 或其他一些非 GWT 技术处理的格式,此时 RPC 可能不是您的最佳选择。