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


person Matthew Gertner    schedule 28.10.2014    source источник
comment
Вам нужно сохранить поле хронологии от DateTime? Это значительно усложнит вашу задачу, если вы это сделаете.   -  person Alex    schedule 29.10.2014
comment
К счастью, нам это не нужно. В любом случае, это просто приспособление для тестирования, поэтому мы можем быть достаточно конкретными в отношении того, что мы делаем, а что не поддерживаем.   -  person Matthew Gertner    schedule 29.10.2014


Ответы (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>
person noisesmith    schedule 28.10.2014
comment
Это как-то лучше, чем просто хранить их в виде строк? В идеале я хотел бы найти решение, которое не требует предварительной/постобработки (см. мой ответ). - person Matthew Gertner; 29.10.2014

Ответ @noisesmith побудил меня более подробно изучить отмеченных читателей (спасибо @noisesmith!). Похоже, https://gist.github.com/ragnard/4738185 позволит мне делать то, что Я хочу. В частности, вы можете привязать новое значение к *data-readers* и указать читателю анализировать значение любым удобным для вас способом.

В этом случае я просто хочу прочитать свои тестовые данные, поэтому мне даже не нужно изменять протоколы print-method и print-dup. Я просто сохраняю данные как обычные даты (#inst "...") и использую макрос with-joda-time-reader для их считывания.

person Matthew Gertner    schedule 29.10.2014