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

欢迎!请参阅关于页面获取更多关于此如何工作的信息。

0

是否存在一种使用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

这可能会解决您的问题,因为您有机会检查值并执行相应的操作,如序列化或抛出。

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

0

关于transit问题,您可以在此地之外在https://github.com/cognitect/transit-clj/issues上提交问题。

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

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