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