- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图将我的一个记录序列化为人类可读的格式。虽然使用 Java serialiser 进行序列化工作正常,但我正在尝试使用 print-dup。我面临的问题是,在写入记录时,读取 clojure.lang.LispReader$ReaderException: java.lang.ClassNotFoundException: common.dummy.Doodh 中的记录结果很好。我是在搞乱命名空间还是什么?请注意,这不是 Java 序列化的问题。下面的代码是最简单的形式
(ns common.dummy)
(defrecord Doodh [id name])
(defn output [filename obj]
(def trr(map->Doodh {:id "moooh" :name "Cows"}))
(def my-string (binding [*print-dup* true] (pr-str trr)))
(spit filename my-string)
)
(defn pull [filename]
(def my-data (with-in-str (slurp filename) (read)))
(println my-data)
)
文本文件内容:
#common.dummy.Doodh["moooh", "Cows"]
最佳答案
不要在函数定义中使用 def。当您使用 def 时,您会在您的命名空间中创建一个 var,并可能将其作为每次函数调用的副作用进行操作。使用 let block 。
如果您想将 Clojure 数据结构保存在文件中,请使用 clojure.edn
。它是安全的(例如,在您不知情的情况下,不会调用文件中定义的任何函数)但它允许启用自定义阅读器(请参见下文)。
使用 defrecord 定义的类型可以使用 pr-str
以 (Clojure-reader-) 可读的方式打印(感谢 @A.Webb 注意到这一点)。在你的例子中,我不明白你为什么不首先坚持使用 HashMap ,但如果你真的需要一个 defrecord,你可以在将它写入文件之前将它转换成一个可读的字符串。
(defrecord Doodh [id name])
(defn output [filename obj]
(spit filename (pr-str obj))
(defn pull [filename]
(with-in-str (slurp filename)
(read)))
read
会使您的代码容易受到 slurped 文件中函数调用的攻击(例如 #=(java.lang.System/exit 0)
)。将自定义阅读器与 EDN 结合使用
我们通过实现 java.lang.Object 接口(interface)的 toString 方法来扩展我们的类型 Doodh:
(defrecord Doodh [id name]
Object
(toString [this] (str "#Doodh" (into {} this))))
因为 spit 使用 str,我们现在可以省略输出函数并简单地从 e 调用 spit。 G。回复:
(spit "Doodh.edn" (map->Doodh {:id "134" :name "Berta"}))
Doodh.edn: #Doodh{:id 134, :name "Berta"}
现在为了确保 Doodh 会被读回,我们使用自定义阅读器函数调用 clojure.edn/read-string
:
(defn pull [filename]
(->> (slurp filename)
(clojure.edn/read-string {:readers {'Doodh map->Doodh}})))
如果您使用新的 pull 回读“Doodh.edn”,您应该会收到一个有效的 Doodh。在 REPL:
(pull "Doodh.edn")
=> #user.Doodh{:id 134, :name "Berta"}
关于serialization - Clojure defrecord 序列化 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991565/
我是 clojure 的新手,基本上正在尝试遵循一些教程。我有一个关于 defrecord 的问题。 这是我正在尝试做的事情: (defrecord somemap [key1 key2 key3 k
我有两个文件knapsack.clj和core.clj 。 有defrecord Item在knapsack.clj 。我想在 core.clj 中使用它,但它在 cider-repl 中给我错误的j
语境 考虑下面的一段代码 (defprotocol ICat "Foo" (meow [cat])) (defrecord Cat [a b] "Cat" ICat (meow [cat]
再次免责声明:我是 Clojure 新手。感谢您的帮助。 我之前的问题 ( Clojure's defrecord - how to use it? ) 产生了一个有效的数据结构和方法:https:/
而defrecord是 Clojure 中定义“实体”的首选形式 - 对于一般情况 - 在 ClojureScript 中可以找到对 deftype 的更多引用。 ,反射(reflect)在 vari
(defprotocol IAnimal "IAnimal" (report [o] (println (type o) " reporting.\n") (inner-repor
我正在尝试使用 Clojure 中的 defrecord 创建自己的不可变数据类型/方法。目标是拥有一个可以创建实例的数据类型,然后调用其方法以返回其自身的新副本以及变异变量。假设 a 和 b 是向量
我在 Clojure REPL 中创建了一个 defrecord: user=> (defrecord Data [column1 column2 column3]) user.Data 如何通过读取
我正在尝试创建一个类似于 Quartzite defjob 宏的宏,它创建了添加了 @DisallowConcurrentExecution 注释的 Job 类。代码在 repl 中有效,但在宏内部无
我建立了一个 leiningen 项目。在其中一个 clojure 源文件中,我定义了一些记录。我的工作流程通常是启动 emacs 并连接到 'lein swank' REPL。连接到 REPL 后,
core=> (defrecord Puffball [id name]) core.Puffball core=> (Puffball. 149 "Urist") #core.Puffball{:i
我在 clojure 程序中使用了许多映射和结构。将这些转换为 defrecords 有什么好处(除了性能之外)? 最佳答案 我认为结构实际上已被弃用,因此我根本不使用它们。 当我在许多 map 实例
我已经创建了一个应用程序信息接口(interface)和一个类,但是当我查看生成的类时,所有方法的返回类型都是 Object,我可以将返回类型更改为 String 吗?文档说类型提示可以使用 defr
定义记录及其实现的接口(interface)后,我可以通过其名称或使用点运算符使用 java 互操作方式调用其方法。 user=> (defprotocol Eat (eat [this])) E
我试图将我的一个记录序列化为人类可读的格式。虽然使用 Java serialiser 进行序列化工作正常,但我正在尝试使用 print-dup。我面临的问题是,在写入记录时,读取 clojure.la
我想做类似的事情: (defrecord Base []) (defrecord Person []) (defrecord Animal []) (derive Person Base) (deri
据我所知,如果我想定义一个只能由一个 defprotocol 实现的协议(protocol)( defrecord ) ,我还是要先定义协议(protocol),再定义defrecord实现它: (d
clojure 中的 defrecord 允许使用自定义字段定义简单的数据容器。 例如 user=> (defrecord Book [author title ISBN]) user.Book 结果
我习惯于在 python/java 中使用 OO。现在做 Clojure。我遇到了 defrecord,但似乎我必须为我希望记录实现的每个函数或一组函数定义一个协议(protocol)。创建新协议(p
如何引用记录的功能? 对于上下文,我使用的是 Stuart Sierra 的组件。所以我有这样的记录: (defrecord MyComponent [] component/Lifecycle
我是一名优秀的程序员,十分优秀!