gpt4 book ai didi

serialization - 在 clojure 中序列化持久数据结构

转载 作者:行者123 更新时间:2023-12-04 06:00:15 24 4
gpt4 key购买 nike

我们都知道 Rich 使用一种理想的基于哈希树的方法来实现 Clojure 中的持久数据结构。这种结构使我们能够在不进行大量复制的情况下操作持久数据结构。

但似乎我找不到序列化这个特定结构的正确方法。例如给出:

(def foo {:a :b :c :d})
(def bar (assoc foo :e :f))
(def bunny {:foo foo :bar bar})

我的问题是:

如何序列化 bunny使得 foo 的内容,即 :a映射到 :b:c映射到 :d ,在连载内容中只出现一次?这就像转储结构的内存镜像。这也像序列化“内部节点”以及引用 here 的“叶节点”。 .

附言如果这是相关的,我正在构建一个大 DAG(有向无环图),其中我们 assoc相当多地将这些节点链接到这些节点,并希望序列化 DAG 以供以后反序列化。图的扩展表示(即,在 repl 中打印 DAG 时将获得的内容)长得令人无法接受。

最佳答案

大维珠,

先说几点:

  • 没有标记化策略的 DAG 将与 DAG 一样长。如果 foo被引用 1 次或多次,每次将完全 已实现 (即显示)在打印期间依次显示。
  • 对于信息的交换(序列化和反序列化),它将在很大程度上取决于您的目标。例如,如果您正在序列化以通过网络发送它,您要么想要完全完成它(如打印的表示),要么您需要使用一些识别/标记化策略对单个数据点进行编码。当然,后者假设接收端可以在理解标记化协议(protocol)的情况下进行反序列化。
  • 标记化策略示例,可以使用 Clojure meta设施可能需要为每个内容 block 引用编码唯一的 key ,并且您的 DAG 包含边缘由 key 表示的节点。

  • 编辑: :自原始帖子以来已修改,以根据评论进行澄清,但示例
    不反射(reflect) DAG 的分层性质。

    一个人为的例子:
    (def node1 {:a :b :c :d})
    (def node2 {:e :f})
    (def dictionary {:foo node1 :bar node2})

    (def DAG [:bunny [:foo :bar]])

    (println DAG) ; => [:bunny [:foo :bar]]

    (defn expand-dag1
    [x]
    (if (keyword? x)
    (get dictionary x x)
    x))

    (println (w/postwalk expand-dag1 DAG)) ; => [:bunny [{:a :b, :c :d} {:e :f}]]

    注:使用向量、 map 、列表等来表达你的 DAG 取决于你。

    关于serialization - 在 clojure 中序列化持久数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31204767/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com