Clojure 2024 状态调查! 中分享你的想法。

欢迎!请参阅 关于页面 了解更多关于如何使用本站的信息。

0
Libs

有没有一种通用的方法来使用 transit (反)序列化数组?

我遇到了这样的情况

(require '[cognitect.transit :as transit])

(def array-write-handler (transit/write-handler "pod.babashka.sql/array" vec))

(def array-type (class (into-array Object [])))

(defn write-transit [v]
  (let [baos (java.io.ByteArrayOutputStream.)]
    (transit/write (transit/writer baos :json {:handlers {array-type array-write-handler}}) v)
    (.toString baos "utf-8")))

(prn (write-transit (into-array Object ["foo"]))) ;; works
(prn (write-transit (into-array String ["foo"]))) ;; ERROR

看起来你不得不为每种类型显式进行序列化编码,这可能导致错误且繁琐。在 transit 决定无法序列化某种类型的对象之前,我能使用某种类型的后备处理程序吗?在这个后备处理中,我可以检查对象是否为数组,使用 .isArray?

我目前的工作方式是使用 walk/postwalk 创建一些自定义表示,但这似乎违背了 transit 的初衷。

2 答案

0

编辑
 
最佳答案

Transit 已添加对 :default-handler 的支持

https://github.com/cognitect/transit-clj/commit/972759aed878d354fbd65de3e4525345955e86b4

这可能解决了问题,因为你有机会检查值并进行适当的序列化或其他操作。

Gist 示例:https://gist.github.com/borkdude/0a99a4f413b509315d54e1c68f861fad

0

关于transit相关的事情,您可以直接在https://github.com/cognitect/transit-clj/issues上提交问题,而不是在这里。

这与其说是个问题,不如说是一个讨论,不过我会在那里提交。

编辑
编辑:评论过时
...