如果要将内容序列化为 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})
请注意,打印一个结构,例如,对单个向量的十个引用,然后读回它,会给你一个具有十个独立(不是)的数据结构,尽管在结构()向量方面是等效的。identical?
=
要在未提供默认实现的情况下使用它,请实现 multimethod 。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
请注意,您应该避免序列化运行时创建的 - 它们是具有奇怪名称的一次性类的实例,无论如何,在重新启动JVM后,您将无法反序列化它们。使用AOT编译,s确实可以获得自己的固定类名。fn
fn
更新:正如在对这个问题的评论中提到的,最适合短期存储/传输数据,而作为长期存储解决方案应该更健壮(跨许多版本的应用程序工作,Clojure等)。原因是这不以任何方式依赖于被序列化的类的结构(所以当向量实现从Java切换到Clojure时,今天的向量仍然是可读的)。Serializable
print-dup
print-dup
print-dup
deftype