我有一个复杂的Clojure数据结构,我想将其序列化-基本上是我正在开发的在线游戏的整个当前游戏状态,以便我可以实现保存游戏文件。
我的要求是:
expressions表达式某种形式的人类可读的文本格式(我可能更喜欢按这种顺序使用s表达式、JSON和XML,但是向others)
。
有什么好的推荐吗?
发布于 2010-07-22 00:57:27
如果你想把东西序列化为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})请注意,打印一个包含10个对单个向量的引用的结构,然后读回它,会得到一个具有10个独立(而不是identical?)的数据结构,尽管在结构(=)向量方面是等效的。
要在没有提供默认实现的情况下使用它,请实现多方法clojure.core/print-dup。
而且,Clojure1.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 -它们是具有奇怪名称的一次性类的实例,并且无论如何在重新启动fn之后都不能反序列化它们。使用AOT编译,fn确实会得到自己固定的类名。
更新:正如在这个问题的评论中提到的,Serializable最适合短期数据存储/传输,而print-dup作为长期存储解决方案应该更健壮(适用于应用程序的许多版本,Clojure等)。原因是,print-dup不以任何方式依赖于被序列化的类的结构(因此,当向量实现从Java切换到Clojure的deftype时,今天的向量print-dup'd仍然是可读的)。
发布于 2012-10-07 13:50:04
edn-format现在已经发布为使用Clojure的数据结构进行数据传输的标准。
它非常适合于序列化Clojure数据结构/值-并且支持多种语言,因此也可以用作数据交换格式。
发布于 2010-07-22 00:50:44
如果一切都是Clojure数据结构,那么它已经序列化了(代码<->数据的b/c)。只需将数据结构转储到磁盘即可。要恢复,请重新加载它们,然后(eval)。
https://stackoverflow.com/questions/3301439
复制相似问题