我想将一些测试数据存储到一个文件中,并在测试中再次读取。数据是一系列Clojure映射,其中一个属性是clj-time
(org.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-method
和print-dup
协议。我只是将数据存储为正常日期(#inst "..."
),然后使用with-joda-time-reader
宏读取它们。