Clojure: сериализация и разбор даты / времени в / из файла?

Я хотел бы сохранить некоторые тестовые данные в файл и снова прочитать их в моих тестах. Данные представляют собой последовательность карт 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, Есть ли какой-нибудь способ прочитать эти значения и правильно их проанализировать, или мне нужно сериализовать их в виде строк и проанализировать вручную, когда я их читаю обратно?

2 ответа

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 макрос, чтобы прочитать их.

Другие вопросы по тегам