首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure数据结构序列化

Clojure数据结构序列化
EN

Stack Overflow用户
提问于 2010-07-22 00:14:05
回答 4查看 9.2K关注 0票数 17

我有一个复杂的Clojure数据结构,我想将其序列化-基本上是我正在开发的在线游戏的整个当前游戏状态,以便我可以实现保存游戏文件。

我的要求是:

expressions表达式某种形式的人类可读的文本格式(我可能更喜欢按这种顺序使用s表达式、JSON和XML,但是向others)

  • Support开放所有常用的Clojure数据结构、关键字和primitives

  • Ability,以便为定制的java类、默认记录等提供定制的序列化/反序列化函数。这一点很重要,因为在某些情况下,我需要做一些类似Java的readResolve的工作)

  • 良好的性能是一个不错的

有什么好的推荐吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-22 00:57:27

如果你想把东西序列化为S表达式,你可以使用print-dup

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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仍然是可读的)。

票数 11
EN

Stack Overflow用户

发布于 2012-10-07 13:50:04

edn-format现在已经发布为使用Clojure的数据结构进行数据传输的标准。

它非常适合于序列化Clojure数据结构/值-并且支持多种语言,因此也可以用作数据交换格式。

票数 7
EN

Stack Overflow用户

发布于 2010-07-22 00:50:44

如果一切都是Clojure数据结构,那么它已经序列化了(代码<->数据的b/c)。只需将数据结构转储到磁盘即可。要恢复,请重新加载它们,然后(eval)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3301439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档