Clojure:将日期/时间序列化到文件或从文件解析日期/时间



我想将一些测试数据存储到一个文件中,并在测试中再次读取。数据是一系列Clojure映射,其中一个属性是clj-timeorg.joda.time.DateTime)日期/时间。当我将值写入文件(使用spit)时,它会序列化为#<DateTime 2014-10-03T12:57:15.000Z>。当我尝试读回(使用slurp)时,我得到:

RuntimeException Unreadable form  clojure.lang.Util.runtimeException (Util.java:221)

我想这并不奇怪,因为如果没有更多的信息,我看不出它会知道如何解析DateTime。有没有什么方法可以读取这些值并正确解析它们,或者我必须将它们序列化为字符串,并在读取它们时手动解析它们?

Clojure附带一个用于java.util.Date 的标记读取器

user> (java.util.Date.)
#inst "2014-10-28T19:46:50.183-00:00"
user> (pr-str (java.util.Date.))
"#inst "2014-10-28T19:47:00.503-00:00""
user> (read-string (pr-str (java.util.Date.)))
#inst "2014-10-28T19:47:11.626-00:00"

一种选择是在写入文件之前从org.joda.time.DateTime转换为java.util.Date,并在读取之后再次转换回来。

user> (.toDate (org.joda.time.DateTime.))
#inst "2014-10-28T19:50:34.859-00:00"
user> (org.joda.time.DateTime. (.toDate (org.joda.time.DateTime.)))
#<DateTime 2014-10-28T12:51:09.231-07:00>

@noisesmith的回答促使我更详细地研究标记读者(感谢@noisesmith!)。看起来像https://gist.github.com/ragnard/4738185会让我做我想做的事。具体来说,您可以将一个新值绑定到*data-readers*,并告诉读取器以您想要的任何方式解析该值。

在这种情况下,我只想读出我的测试数据,这样我甚至不需要修改print-methodprint-dup协议。我只是将数据存储为正常日期(#inst "..."),然后使用with-joda-time-reader宏读取它们。

相关内容

  • 没有找到相关文章

最新更新