在Java中序列化日期

Sla*_*ast 7 java serialization web-services date

我通过Web服务传递一些对象,其中一些包含java.sql.Date.因为Date没有空构造函数,所以它不希望序列化.

问题的第一部分很简单:在客户端和服务之间传递日期的最佳方法是什么?

第二部分有点棘手:一旦我决定如何传递日期,我显然可以声明日期瞬态并使一些包装类将日期作为字符串或其他方式传递,但如何将相同的解决方案尽可能透明地应用于包含Date的几个类?

(我有一种预感,DynamicProxy可能是一个解决方案,但在Sun的网站上阅读文档并不是很有帮助,所以如果它确实是朝这个方向发展的话,那么将会有一些澄清)

编辑:我问了错误的问题,对不起(我和同事之间的一些误解实际上是一个问题).由于反序列化而出现问题.因此,一旦我有xml格式的日期,它会尝试将自身反序列化为GregorianCalendar.问题的其他部分仍然存在:接收某些东西(长时间戳或GregorianCalendar)并将其转换为sql日期的最佳方式是什么,而不为10个不同的类制作10个不同的包装器.我正在使用NetBeans代码和wsdl生成.

Jer*_*eur 8

乔达时间

Date类有一个笨重的API.更好的实施是Joda-Time.

ISO 8601

Joda-Time还允许您以ISO 8601标准格式转换日期(yyyy-mm-ddTHH:MM:SS.SSS).将日期从服务器移动到其客户端时使用此标准有利于以可读格式包含完整日期.当您使用例如JAXB时,日期的XML表示也是此ISO标准.(参见XMLGregorianCalendar类)

  • 另请注意,即将推出的JSR 310 Date&Time API for Java 7将基于ISO8601和Joda Time的概念.所以这是一个很好的未来发展方向. (3认同)

ent*_*zik 6

如前所述,序列化由Date.getTime()返回的long将起作用.但是,您应该注意,如果您的服务器位于客户端以外的其他时区,则您在另一侧重建的日期将会有所不同.如果您想要重建完全相同的日期对象,您还需要发送您的时区(TimeZone.getID())并使用它来重建另一侧的日期.


cag*_*boy 2

java.sql.Date 扩展 java.util.Date

只需使用 getTime() 即可从中获取 long 值。可以对其进行序列化,并在另一端根据它构造一个新的 java.sql.Date(long) 或新的 java.util.Date(long) 。