还有其他解决方案,而不是破解Date_CustomFieldSerializer并重新编译GWT

时间:2012-05-29 13:11:24

标签: gwt date serialization

我一直在搜索 java.util.Date 序列化以及不同的客户端/服务器区域设置问题。

对于那些没有被告知此事的人,这里有一个简短的解释:

GWT日期RPC中的序列化是根据您拥有的语言环境完成的。因此,如果客户端服务器具有不同的区域设置,则用户可以输入一个日期,服务器将最终在数据库上存储其他日期,具体取决于其区域设置。

这是预期的行为,在许多情况下似乎是正确的行为。

例如,如果您从纽约的浏览器安排某个日期/小时的会议,那么检查SF会议时间的人是否会看到相应的区域设置值。

现在出生日期怎么样?在这种情况下,如果你出生于12月5日,那么中国的某些人读到你在12月6日出生时看起来并不准确。

有些人说一个解决方案可能是使用字符串而不是日期,但我不这么认为,主要是因为例如你不能添加或减少字符串。

所以解决这个问题的最好方法是自定义序列化,但不幸的是GWT提供了自己的 Date_CustomFieldSerializer

对于我所读到的,唯一的解决方案是执行此文件的自己版本并重新编译GWT源。 我不想这样做,所以这就是为什么我问是否有人知道更好的解决方案,或者GWT的人是否正在为未来版本规划一些插件序列化基础设施。

提前致谢。 丹尼尔

1 个答案:

答案 0 :(得分:4)

java.util.Date表示某个特定时刻。你是在特定时刻出生的;它可能是你所在时区的12月5日,但是12月6日在中国,这并没有改变你出生的确切时刻。

好像你想存储一个"日 - 月 - "三联而不是特定时刻。如果是这种情况,则将其存储为三元组(可能序列化为String),而不是java.util.Date;换句话说,使用正确的工具来完成工作。

你说你认为它是错的,因为“你无法添加或减少字符串”。好吧,你也不能添加或减去日期。如果你想用日期做一些计算,那么要么意味着你真的想要存储一个日期(和中国人看到你在12月6日出生的事实一起生活,因为那是你的约会对象)碰巧出生在他的时区,而不是12月5日,这是你的时区中的日期),或者你想暂时将你的DMY三联体转换为日期(并进行近似计算,导致你的中国朋友祝你生日快乐太早了一天:在他的时区12月5日,你的时区仍然是12月4日。) 使用DateTimeFormat,将日期序列化/解析为DMY(例如yyyy-MM-dd)并始终使用当前时区,这非常简单。

BTW:说 GWT日期RPC中的序列化是根据您不准确的语言环境完成的:GWT序列化日期的时间戳(自Epoch以来的秒数,由{返回) {1}}),具体是时区依赖 更不用说locale!= timezone。