Сериализация / Бинарный формат

(require '[clojure.edn :as edn] '[clojure.walk :as walk])

(defrecord Size [width height])
(defrecord Rect [size])

(def rect (->Rect (->Size 5 10)))

; EDN knows no records, so every one of them
; is turned into a plain map first
; Encoding Binary Data
(def rect-b
  (.getBytes
    (pr-str (walk/postwalk
              #(if (record? %) (into {} %) %) rect))
    "UTF-8"))

; Decoding Binary Data
(def rect2 (-> (String. rect-b "UTF-8")
               edn/read-string
               (update :size map->Size)
               map->Rect))

(println "rect2 size width is" (:width (:size rect2)))