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上提交问题,而不是在这里。

好吧,这与其说是一个问题,倒不如说是一个意见,但我会在那边提交。

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