【发布时间】:2011-10-09 05:28:36
【问题描述】:
我正在寻找一种将 Clojure 对象有效地序列化为 二进制 格式的方法 - 即不仅仅是进行经典的打印和读取文本序列化。
即我想做类似的事情:
(def orig-data {:name "Data Object"
:data (get-big-java-array)
:other (get-clojure-data-stuff)})
(def binary (serialize orig-data))
;; here "binary" is a raw binary form, e.g. a Java byte array
;; so it can be persisted in key/value store or sent over network etc.
;; now check it works!
(def new-data (deserialize binary))
(= new-data orig-data)
=> true
动机是我有一些包含大量二进制数据(在 Java 数组中)的大型数据结构,我想避免将这些全部转换为文本并再次转换回来的开销。此外,我试图保持格式紧凑,以最大限度地减少网络带宽的使用。
我希望拥有的特定功能:
- 轻量级的纯 Java 实现
- 支持 Clojure 的所有标准数据结构以及所有 Java 原语、数组等。
- 不需要额外的构建步骤/配置文件 - 我宁愿它“开箱即用”
- 在所需的处理时间方面表现良好
- 二进制编码表示的紧凑性
在 Clojure 中执行此操作的最佳/标准方法是什么?
【问题讨论】:
-
根据您的编码内容和编码方式,文本可以比某些二进制格式更快、更紧凑。通常,序列化的开销是使用反射而不是转换,因此支持任意数据结构的需求很可能是您真正的问题。这比较了罐装与 Java 序列化,vanillajava.blogspot.com/2011/08/…
-
它是否必须能够处理对运行时对象的引用,例如 atom 和 refs?
-
我在使用 Kryo 与 Cascalog、ElephantDB 和 Storm 时取得了巨大的成功。 carbonite,由 revelytix 提供,为大多数 Clojure 数据结构提供开箱即用的序列化程序。
标签: java serialization clojure