Сериализация структуры данных Clojure

В индексе пакета есть библиотека флекса , которая может обрабатывать эти вещи для вас. В этом случае вы будете искать inflection.underscore() :

>>> inflection.underscore('CamelCase')
'camel_case'

17
задан mikera 21 July 2010 в 16:14
поделиться

4 ответа

Если вы хотите сериализовать вещи в S-выражения, вы можете использовать print-dup:

(binding [*print-dup* true] (println [1 2 3]))
; prints [1 2 3]

(defrecord Foo [x])
; => user.Foo
(binding [*print-dup* true] (println (Foo. :foo)))
; prints #=(user.Foo/create {:x :foo})

Обратите внимание, что печать структуры, которая содержит, скажем, десять ссылок на один вектор, с последующим чтением ее обратно дает вам структуру данных с десятью отдельными (не одинаковыми?), хотя и эквивалентными по структуре (=) векторами.

Чтобы использовать это в случаях, когда нет реализации по умолчанию, реализуйте мультиметод clojure.core/print-dup.

Также, многие вещи в Clojure 1.2 являются java.io.Serializable:

(every? (partial instance? java.io.Serializable)
        [{1 2} #{"asdf"} :foo 'foo (fn [] :foo)])
; => true

(defrecord Foo [])
(instance? java.io.Serializable (Foo.))
; => true

Обратите внимание, что вам следует избегать сериализации созданных во время выполнения fnов - они являются экземплярами одноразовых классов со странными именами, и вы все равно не сможете десериализовать их после перезапуска JVM. При компиляции AOT, fns получают свои собственные фиксированные имена классов.

Обновление: Как упоминалось в комментарии к вопросу, Serializable лучше всего подходит для краткосрочного хранения/передачи данных, тогда как print-dup должен быть более надежным решением для долгосрочного хранения (работа во многих версиях приложения, Clojure и т.д.). Причина в том, что print-dup никак не зависит от структуры сериализуемых классов (так что вектор print-dup'd сегодня все еще будет читаем, когда реализация вектора перейдет от Java к deftype Clojure).

11
ответ дан 30 November 2019 в 13:04
поделиться

edn-формат был выпущен в качестве стандарта для передачи данных с использованием структур данных Clojure.

Это очень хорошо подходит для сериализации структур / значений данных Clojure - и поддерживается на нескольких языках, поэтому также может использоваться в качестве формата обмена данными.

7
ответ дан 30 November 2019 в 13:04
поделиться

для JSON вы можете использовать стандартный clojure-contrib.json . Хотя, насколько я помню, все объекты Clojure должны быть сериализуемыми ...

3
ответ дан 30 November 2019 в 13:04
поделиться

Если все является структурой данных Clojure, то она уже сериализована (b / c кода <-> данных). Просто выгружайте структуры данных на диск. Для восстановления загрузите их обратно и (eval).

5
ответ дан 30 November 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: