2014-10-28 7 views
0

Я хотел бы сохранить некоторые тестовые данные в файл и прочитать его снова в своих тестах. Данные представляют собой последовательность карт Clojure, одним из свойств которых является дата/время clj-time (org.joda.time.DateTime). Когда я пишу значение в файл (с spit), он сериализуется как #<DateTime 2014-10-03T12:57:15.000Z>. Когда я пытаюсь прочитать его обратно (с slurp), я получаю:Clojure: сериализация и синтаксический анализ даты/времени в/из файла?

RuntimeException Unreadable form clojure.lang.Util.runtimeException (Util.java:221) 

Я думаю, что это не удивительно, так как без дополнительной информации, которую я не понимаю, как он будет знать, как разобрать DateTime. Есть ли способ прочитать эти значения и правильно ли они разбираться или я должен их сериализовать как строки и проанализировать их вручную, когда я их прочитаю?

+0

Вам нужно сохранить поле хронологии из 'DateTime'? Это сделает вашу задачу намного сложнее, если вы это сделаете. – Alex

+0

К счастью, нам это не нужно. Так или иначе, это всего лишь тестовая арматура, поэтому мы можем быть весьма конкретными в отношении того, что мы делаем и не поддерживаем. –

ответ

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.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> 
+0

Разве это лучше, чем просто хранить их как строки? В идеале я бы хотел найти решение, которое не требует предварительной/пост-обработки (см. Мой ответ). –

0

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

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