3
repl> (-> root zip/down zip/right)
[{:answer-keys [5 6], :id 3} {:l [{:id 2, :answer-keys []}], :pnodes [{:answer-keys [2 3 4], :id 1}], :ppath nil, :r ({:answer-keys [7], :id 4})}]

担当者にジッパーを印刷すると、このデータが表示されます。これが、ジッパーをシリアル化するために必要なすべてのデータである可能性があると思いますか?提供されたデータからジッパーを逆シリアル化することは可能ですか?

以下に想像するzip/serializeおよびzip/deserialize関数のようなものを探しています。

(def s (zip/serialize (-> root zip/down zip/right))) ;; s is a string
(def d (zip/deserialize s)) ;; d is a zipper location
;;And I can go on using the deserialized zipper d without any difficulty.

誰かがこれを行う方法を知っていますか?

4

2 に答える 2

4

ジッパーの魔法は、ツリー構造の任意に変更されたバージョンを生成するために必要なすべてを表すデータ構造であることです。ジッパー適切な値であり、状態を必要としないため、正常に印刷および読み取りされます

pr-strで「シリアル化」および「逆シリアル化」できますread

ジッパーを作る:

user> (zip/vector-zip [[1 [2]][3][4]])
[[[1 [2]] [3] [4]] nil]
user> (def s (zip/vector-zip [[1 [2]][3][4]]))
#'user/s
user> s
[[[1 [2]] [3] [4]] nil]

文字列にシリアル化します。

user> (def serialized-s (pr-str (zip/next s)))
#'user/serialized-s
user> serialized-s
"[[1 [2]] {:l [], :pnodes [[[1 [2]] [3] [4]]], :ppath nil, :r ([3] [4])}]"

それを読み返します:

user> (def deserialized-s (read-string "[[1 [2]] {:l [], :pnodes [[[1 [2]] [3] [4]]], :ppath nil, :r ([3] [4])}]"))
#'user/deserialized-s

結果で何かをします:

user> (zip/root deserialized-s)
[[1 [2]] [3] [4]]
于 2012-04-30T22:14:05.257 に答える
3

アーサーの答えを拡張するには:

おそらく、clojure.zip がジッパーに配置するメタデータをシリアル化する必要もありbranch?ます。だから何かchildrenmake-node

(defn serialize [zipper]
  (binding [*print-meta* true]
    (pr-str zipper)))

(def deserialize read-string)
于 2012-05-01T05:09:02.707 に答える