1

我想将一些测试数据存储到一个文件中,并在我的测试中再次读出。数据是一系列 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. 有没有办法读取这些值并正确解析它们,或者我必须将它们序列化为字符串并在我读回它们时手动解析它们?

4

2 回答 2

1

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.DateTimeto转换,并在读取后再次转换回来。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>
于 2014-10-28T19:48:51.490 回答
0

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

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

于 2014-10-29T09:50:35.387 回答