我如何从文件中反序列化记录结构,已经使用 print-dup 保存到文件中?

2024-02-28

我有以下代码:

(use 'clojure.java.io)
(defrecord Member [id name salary role])  
(defrecord Role [id name])
(def member-records (ref ()))
(defn add-member [member]
(dosync (alter member-records conj member)))

;;Test-data -->
(def dev-r(->Role 1 "Developer"))
(def test-member1(->Member 1 "Kirill" 70000.00 dev-r))
;;Test-data <--

(defn save-data-2-file []
  (with-open [wrtr (writer "C:/Platform/Work/test.cdf")]  
    (print-dup @member-records wrtr)))

(defn process-line [line]
  (println line))

 ;;Test line content
 ;;#BTC.pcost.Member{:id 1, :name "Kirill", :salary 70000.0, :role #BTC.pcost.Role{:id 1, :name "Developer"}})

(defn load-data-from-file []
  (with-open [rdr (reader "C:/Platform/Work/test.cdf")]
   (doseq [line (line-seq rdr)]
     (process-line line))))

我想在读取文件后重新创建记录,但我不明白如何做到这一点。是的,我知道我可以解析文本并通过解析行的元素填充我的结构,但这会很困难,因为我有很多像“成员”和“角色”这样的结构。任何人都可以建议我一种我可以做的方法吗?


您可以使用read-string http://clojuredocs.org/clojure_core/clojure.core/read-string, and slurp http://clojuredocs.org/clojure_core/clojure.core/slurp,从文件中提取记录。read-string http://clojuredocs.org/clojure_core/clojure.core/read-string仅限于读取字符串的第一种形式,但是,从您的示例中,您仅将单个形式存储为记录列表。

(defn load-data-from-file [file]
  (read-string (slurp file)))

懒惰阅读

如果您需要的不仅仅是第一种形式,或者无法将整个流读入内存,您可以使用read http://clojuredocs.org/clojure_core/clojure.core/read直接,做一个懒惰的读者。

(defn lazy-read
  ([rdr] (let [eof (Object.)] (lazy-read rdr (read rdr false eof) eof)))
  ([rdr data eof]
    (if (not= eof data)
      (cons data (lazy-seq (lazy-read rdr (read rdr false eof) eof))))))

(defn load-all-data [file]
  (with-open [rdr (java.io.PushbackReader. (reader file))]
    (doall (lazy-read rdr))))

(load-all-data "C:/Platform/Work/test.cdf")

Security

另外,在加载代码时最好提到安全性read-string http://clojuredocs.org/clojure_core/clojure.core/read-string or read http://clojuredocs.org/clojure_core/clojure.core/read。你应该只使用它们可信来源,因为,使用#=或 Java 构造函数,源代码可以在应用程序内执行任意代码。有关更长的解释,请查看文档read http://clojuredocs.org/clojure_core/clojure.core/read.

Setting *read-eval* http://clojuredocs.org/clojure_core/clojure.core/%2aread-eval%2a to false可以防止出现此问题,但也会阻止重建样本中的记录。为了避免这个问题,您可以使用clojure.edn/read http://clojure.github.io/clojure/clojure.edn-api.html and clojure.edn/read-string http://clojure.github.io/clojure/clojure.edn-api.html功能,具有读者白名单。

(defn edn-read [eof rdr]
  (clojure.edn/read {:eof eof :readers {'BTC.pcost.Role map->Role
                                        'BTC.pcost.Member map->Member}}
                    rdr))

(defn lazy-edn-read
  ([rdr] (let [eof (Object.)] (lazy-edn-read rdr (edn-read eof rdr) eof)))
  ([rdr data eof]
   (if (not= eof data)
     (cons data (lazy-seq (lazy-edn-read rdr (edn-read eof rdr) eof))))))

(defn load-all-data [file]
  (with-open [rdr (java.io.PushbackReader. (reader file))]
    (doall (take-while (complement nil?) (lazy-edn-read rdr)))))

(load-all-data "C:/Platform/Work/test.cdf")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何从文件中反序列化记录结构,已经使用 print-dup 保存到文件中? 的相关文章

随机推荐

  • 如何创建具有延迟的可观察对象

    Question 出于测试目的 我正在创建Observable替换实际 http 调用返回的可观察对象的对象Http 我的可观察对象是使用以下代码创建的 fakeObservable Observable create obs gt obs
  • 什么是 gitlab runner

    我想我从根本上错过了一些东西 我是 CI CD 新手 正在尝试使用 gitlab 建立我的第一个管道 该项目是一个预先存在的 PHP 项目 我还不想清理它 目前我已经将整个东西推入了 docker 容器 并且它与谷歌云的 mysql 数据库
  • 模拟跨上下文连接--LINQ/C#

    问题是这样的 我有 2 个数据上下文 我想对其进行联接 现在我知道 LINQ 不允许从一个上下文连接到另一个上下文 并且我知道有 2 种可能的解决方案是创建单个数据上下文或有 2 个单独的查询 这就是我现在正在做的事情 然而我想做的是 模拟
  • 如何管理 git 中的重叠存储库,包括同一目录中的文件?

    我有一个复杂的存储库 有时代码段之间的逻辑边界跨越目录边界 有时目录 X 中的单个文件确实需要与目录 Y 中的文件一起使用 例如 假设我有一个如下所示的中央存储库 a foo a bar b baz1 b baz2 我希望我的本地存储库最终
  • 如何通过 Curl 和 PHP 发送 SOAP XML?

    这已经困扰我好几天了 我正在尝试通过 Curl 发送 SOAP 帖子 但我总是收到 无法连接到主机 错误 但是 我真的不知道如何解决 我有一个 ASP 版本 它可以在相同的 URL 和数据下正常工作 我认为这只是 PHP Curl 的事情
  • AWS Lambda Python 3.7 运行时异常日志记录

    使用 Python 3 7 运行时时引发的未处理异常似乎不会像在 Python 3 6 中那样记录到 CloudWatch 如何在 Python 3 7 中设置记录器来捕获此信息 还发布在 AWS 论坛上 https forums aws
  • pytorch index_put_给出运行时错误:“索引”的导数未实现

    这是后续问题这个问题 https stackoverflow com q 65584330 3337089 我尝试使用index put 如建议的答案 https stackoverflow com a 65584479 3337089 但
  • 当有很多要发送的值时,将值传递给函数的最佳方法是什么?

    当您必须将许多值传递给函数并且其中一些值可能是可选的时 定义方法签名的最佳方法是什么 将来 我可能必须传递更多变量或减去一些传递给函数的值 例如 电话和地址可选 function addInfo name dob phone address
  • 针对 R+(版本 30 及更高版本)要求已安装 APK 的 resources.arsc 未压缩存储并在 4 字节边界上对齐

    我正在尝试将 android 目标 API 从 29 更新到 30 我已更新 compileSdkVersion 30 targetSdkVersion 30 buildToolsVersion 30 0 2 该应用程序与zipalign
  • cocoa 应用程序中提示 root 访问权限

    我希望我的程序以要求 root 访问权限的提示 警报开始 用户必须输入密码 然后应用程序就会启动 我一直在环顾四周 但我不太确定该怎么做 非常感谢您的帮助 Thanks 这是苹果公司关于此事的文档 http developer apple
  • 如何消除TPaintBox右边缘的闪烁(例如调整大小时)

    总结 假设我有一个 TForm 和两个面板 面板对齐 alTop 和 alClient alClient面板包含一个TPaintBox 其OnPaint涉及绘图代码 组件上 DoubleBuffered 的默认值为 false 在绘制过程中
  • 为什么 Icon Composer 2.4 不再支持 1024x1024 尺寸的图标?

    Xcode 4 3 3中的图标编辑器2 2支持1024x1024的icns 然而 对于 Icon Composer 2 4 它不再支持这一点 这很讽刺 因为苹果推动了视网膜显示屏mbp 并要求新提交的应用程序使用1024x1024图标 但图
  • Android 手风琴/手风琴/折叠动画

    我正在尝试创建一个交互式手风琴 手风琴 折叠动画 以便视图在交互时自行折叠 展开 以同样的方式折叠视图 但两侧都折叠 我认为我可以做到的方法是重写 onDraw 方法 以某种方式复制画布或画布上的信息 然后绘制以一种方式旋转的画布的前半部分
  • 不支持表/列名称中的方括号?

    postgresql 是否不支持表名 列名或数据类型中的方括号 在 pgadmin 中运行查询时出现以下错误 CREATE TABLE Test ERROR syntax error at or near SQL状态 42601 在 Pos
  • 模板继承的 UML 图

    在我的库的文件中 我有一个继承自模板的类 我的代码示例 class data class dataA public data class dataB public data inheritance from a template templ
  • 获取 div 中锚点的 href 并将其应用到图像?

    我有一个 div 其中有图像和链接 是否有可能在页面加载时 我可以以某种方式找到链接的 href 并应用图像的锚标记 我知道这似乎是一个奇怪的请求 我只是问是否可以做到 如果可以 怎么做 http jsfiddle net fFgwb ht
  • R 中 beanplot 上的多种颜色

    我使用以下命令在 R 中创建了豆图 beanplot windA side both border NA col list gray c red white ylab Wind Speed m s what c 1 1 1 0 xaxt n
  • 无法在 Nginx 服务器中使用 LetsEncrypt 设置 HTTPS

    我按照以下教程在 DigitalOcean 上为我的网站设置 https https www digitalocean com community tutorials how to deploy a laravel application
  • QuickSort对递归深度的估计

    递归深度是 QuickSort 达到其基本情况之前连续递归调用的最大数量 并注意它 递归深度 是一个随机变量 因为它取决于所选的主元 我想要的是估计快速排序的最小可能和最大可能递归深度 以下过程描述了 QuickSort 通常实现的方式 Q
  • 我如何从文件中反序列化记录结构,已经使用 print-dup 保存到文件中?

    我有以下代码 use clojure java io defrecord Member id name salary role defrecord Role id name def member records ref defn add m