我想知道是否是反序列化服务器响应的方法。因此,在我的例子中,我有一个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获取LinkedHashMap数据吗?
发布于 2018-05-07 13:17:30
LinkedHashMap在这个响应中--这个响应是一个对象流(也就是说,如果同一个值出现了两次,那么它只能序列化一次,这使得内容更小,并且还允许循环引用而不是平坦的树)。
读取RPC有效负载是“向后读取”--从末尾开始,向后读取,从7(版本)开始,0(设置的标志),字符串的大[] ( "string表“,解码答复所需的字符串,以便每个字符串只列出一次)。
然后是一个1 --流中的第一个对象是string表中第一个条目的类型,即您正在寻找的"java.util.LinkedHashMap/3008245022"。要解码一个LinkedHashMap,我们首先需要知道它是如何排序的--下一个0值告诉我们它使用默认的“插入顺序”,然后下一个2表示映射中有两个条目。
现在我们迭代,直到我们看到了这两对键和值。下一个值将告诉我们正在查看的是什么类型的键:2的意思是进入string表,然后我们看到"java.lang.String/2004016611",因此我们知道它将是一个字符串,然后3也从string表中向我们显示"AA"。接下来是4,该键的值的类型,可以预见来自string表的这个"java.util.Date/3385151746"。为了反序列化一个日期,我们从有效负载GWT 64中读取一个long,对其进行编码以使其更小--这是'WM577vZ',下一个令牌。
接下来的4个令牌(2、5、4和'WM577vZ')重复这个过程,将第二个字符串键添加到映射中,并为其添加日期值。
--
这个特定的有效负载并不是真正显示RPC功能的那种负载,但它很容易手动读取。在GWT应用程序之外对它们进行解码目前并不容易(虽然我正在开发一个通用工具,它应该可以在任何地方被解码,但答案并不是谈论它的真正的地方)--如果您想要一种可以由普通JS或其他非GWT技术处理的格式,RPC可能不是您目前的最佳选择。
发布于 2018-05-07 12:40:26
我想你是在找像restyGWT这样的东西。
但我不太明白你的问题所以我可能错了。
https://stackoverflow.com/questions/50211232
复制相似问题