反序列化服务器响应
Deserialize server response
我想知道是否可以反序列化服务器响应。所以在我的例子中,我有一个 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 数据?
我认为您正在寻找类似 restyGWT 的东西。
但是我不太明白你的问题,所以我可能是错的。
LinkedHashMap 在该响应中 - 该响应是一个对象流(即而不是 JSON,如果相同的值出现两次,它只会被序列化一次,这让内容更小,并且还允许循环引用,而不仅仅是平面树)。
读取 RPC 负载已完成 "backward" - 从末尾开始向后读取,我们从 7(版本)、0(设置的标志)开始,一个大的 []
字符串("string table",解码回复所需的字符串,因此每个字符串只列出一次)。
然后是 1
- 流中的第一个对象是字符串 table 中第一个条目的类型,即您要查找的 "java.util.LinkedHashMap/3008245022"
。要解码 LinkedHashMap,我们首先需要知道它是如何排序的——下一个 0
值告诉我们它使用默认值 "insertion-order",然后下一个 2
表示有地图中的两个条目。
现在我们迭代,直到我们看到两对键和值。下一个值将告诉我们正在查看的键类型:2
表示进入字符串 table 并且我们看到 "java.lang.String/2004016611"
,因此我们知道它将是一个字符串,然后 3
向我们显示 "AA"
也来自字符串 table。接下来是 4
,该键的值的类型,可以预见,这个 "java.util.Date/3385151746"
来自字符串 table。为了反序列化日期,我们从有效负载中读取 long
- GWT base64 对这些进行编码以使其更小 - 这是 'WM577vZ'
,下一个标记。
接下来的 4 个标记,(2
、5
、4
和 'WM577vZ'
) 重复这个过程,将第二个字符串键添加到映射中,并且它的日期值。
--
这种特殊的有效载荷并不是真正显示 RPC 功能的那种,但用手阅读起来相当简单。在 GWT 应用程序之外解码它们目前不是很容易(尽管我正在开发一个通用工具,应该让它在任何地方解码,但 SO 答案并不是真正谈论它的地方) - 如果你想要可以由纯 JS 或其他一些非 GWT 技术处理的格式,此时 RPC 可能不是你最好的选择。
我想知道是否可以反序列化服务器响应。所以在我的例子中,我有一个 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 数据?
我认为您正在寻找类似 restyGWT 的东西。
但是我不太明白你的问题,所以我可能是错的。
LinkedHashMap 在该响应中 - 该响应是一个对象流(即而不是 JSON,如果相同的值出现两次,它只会被序列化一次,这让内容更小,并且还允许循环引用,而不仅仅是平面树)。
读取 RPC 负载已完成 "backward" - 从末尾开始向后读取,我们从 7(版本)、0(设置的标志)开始,一个大的 []
字符串("string table",解码回复所需的字符串,因此每个字符串只列出一次)。
然后是 1
- 流中的第一个对象是字符串 table 中第一个条目的类型,即您要查找的 "java.util.LinkedHashMap/3008245022"
。要解码 LinkedHashMap,我们首先需要知道它是如何排序的——下一个 0
值告诉我们它使用默认值 "insertion-order",然后下一个 2
表示有地图中的两个条目。
现在我们迭代,直到我们看到两对键和值。下一个值将告诉我们正在查看的键类型:2
表示进入字符串 table 并且我们看到 "java.lang.String/2004016611"
,因此我们知道它将是一个字符串,然后 3
向我们显示 "AA"
也来自字符串 table。接下来是 4
,该键的值的类型,可以预见,这个 "java.util.Date/3385151746"
来自字符串 table。为了反序列化日期,我们从有效负载中读取 long
- GWT base64 对这些进行编码以使其更小 - 这是 'WM577vZ'
,下一个标记。
接下来的 4 个标记,(2
、5
、4
和 'WM577vZ'
) 重复这个过程,将第二个字符串键添加到映射中,并且它的日期值。
--
这种特殊的有效载荷并不是真正显示 RPC 功能的那种,但用手阅读起来相当简单。在 GWT 应用程序之外解码它们目前不是很容易(尽管我正在开发一个通用工具,应该让它在任何地方解码,但 SO 答案并不是真正谈论它的地方) - 如果你想要可以由纯 JS 或其他一些非 GWT 技术处理的格式,此时 RPC 可能不是你最好的选择。