在
https://github.com/danielcompton/data.fressian-test上运行测试时,我发现了这个错误
(let [mys {[3] [] :a nil, :b nil :c nil :d nil :e nil :f nil :g nil}
myf (fr/read (fr/write mys))]
(println (type mys))
(println (type (key (first mys))))
(println (type myf))
(println (type (key (first myf))))
(= mys myf))
clojure.lang.PersistentArrayMap
clojure.lang.PersistentVector
clojure.lang.PersistentHashMap
java.util(Arrays$ArrayList
=> false
将键[3]更改为:x
{:x [] :a nil, :b nil :c nil :d nil :e nil :f nil :g nil}
或删除另一个键值对
{[3] [] :b nil :c nil :d nil :e nil :f nil :g nil}
将使Fressian值的往返编码相等。
这是因为1.6中引入的哈希行为变化,与CLJ-1372有关。我认为这可能与Fressian为具有少于8个键值对的Map创建ArrayMap有关。
一个解决方案是确保data.fressian始终返回持久Clojure数据结构,以避免遇到Clojure不再将Java数据结构与类似的Clojure之一视为相等的问题。