出于调试目的从 GWT RPC 有效负载中反序列化日期和时间戳

Posted

技术标签:

【中文标题】出于调试目的从 GWT RPC 有效负载中反序列化日期和时间戳【英文标题】:De-serialize Date and Timestamp from GWT RPC payload for debugging purposes 【发布时间】:2016-11-09 01:53:08 【问题描述】:

我正在尝试了解远程过程调用的有效负载中的数据字段。而 Date 和 Timestamp 类型的对象最让我困惑。

完整的请求负载如下所示:

7|0|8|https://myapp.com/myapp/client/|72119BCB4CE5FB8D147EA76E8006F76E|com.myapp.service.MyService|updateTimepoint|java.lang.String/2004016611|java.util.Date/3385151746|554455|java.sql.Timestamp/3040052672|1|2|3|4|2|5|6|7|8|VhGcuow|0|

在代码中定义的这个服务的接口是:

public void updateTimepoint(String myId, Date timepoint,
                    AsyncCallback<Void> async);

从上面的值数组中,我会告诉 bold 部分(见下文)指的是发送的 java.util.Date 对象和中间的“554455” - 是 myId(我知道来自用例)。我无法解释为什么将 myId 变量放在中间:

java.util.Date/3385151746|554455|java.sql.Timestamp/3040052672

现在我正在调试混淆代码,因此在浏览器中查看源选项卡似乎不是一个选项。但这不会有太大帮助,因为您会看到奇怪的 JS 日期引用。我也不知道怎么读。

那么,我如何将有效载荷变量中的 Date+Timestamp 编译回可读的内容?

谢谢!

附:或者 - VhGcuow 是日期吗?根据GWT java.util.Date serialization

【问题讨论】:

如果您建议应该将哪个日期隐藏在数据中,这可能会有所帮助。值 3385151746、3040052672 和 2004016611 从 ECMAScript 纪元被视为秒或毫秒时似乎不是时间值。 我希望它是 - 2016 年 8 月 11 日(11 月)16:18:xx。但这是练习的目标 - 检查应用发送的 Date 对象值是否正确,因为我对此有一些疑问。 【参考方案1】:

正如@RobG 所说,这些数字不是值,而是有关日期、时间戳类型的详细信息。有效负载是| 分隔的,那些/s 是类名字符串的一部分。请参阅Serializing RPC-GWT(我今年早些时候的回答)以获取有关有效负载中字符串和其他内容的顺序的更多详细信息。

VhGcuow 可能是一个 base64 编码的 long。日期(可能还有时间戳,虽然我没有检查过)被序列化为一个长字段,因此作为 long 的值将表示自 1970 年 1 月 1 日以来的毫秒数。有关如何理解的更多讨论,请参阅RPC-GWT Serialization/java.util.Date Encoding和解码,而不是简单地相信 RPC 工作。

请注意,尽管 RPC 多年来没有改变,并且被成千上万的 GWT 开发人员使用,他们没有遇到过正确序列化日期的问题。更有可能正在发生其他事情(例如时区问题) - 询问另一个问题,其中包含问题的所有详细信息和“有效”的测试用例可能会让您更快地得到答案。

【讨论】:

谢谢,科林。我会检查链接。我预计不会出现任何序列化低级问题。这是我的客户端代码抓取了错误的 Date 对象,我只是想检查传递给服务器的内容。 再次感谢。我找到了解决问题所需的所有信息。

以上是关于出于调试目的从 GWT RPC 有效负载中反序列化日期和时间戳的主要内容,如果未能解决你的问题,请参考以下文章

GWT RPC 如何在其有效负载中编码 java.lang.Long 值?

GWT-RPC 序列化的 ImmutableCollection 声明

使用 RPC 服务创建 GWT.create 的目的是啥?

GWT 2.3 升级后的 RPC 错误

GWT 对象序列化

使用 GWT 内置的 RPC 序列化/反序列化机制