从 GWT RPC 负载中反序列化日期和时间戳以进行调试

De-serialize Date and Timestamp from GWT RPC payload for debugging purposes

我正在尝试了解我的远程过程调用的有效负载中的数据字段。而 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 编译回可读的内容?

谢谢!

P.S。或者 - VhGcuow 是约会对象吗?根据

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

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

请注意,尽管 RPC 多年来没有改变,并且被成千上万的 GWT 开发人员使用,他们没有遇到 Date 正确序列化的问题。更有可能是其他问题正在发生(例如时区问题)- 提出另一个问题并提供问题的所有细节和 "working" 测试用例可能会让您更快地找到答案。