在这里重新整理了之前的对话,以备归档——使用关键字作为名称的局部部分将导致 clj-uuid 使用 Java 序列化将对象序列化为字节。
Clojure 1.11 对 Keyword 做了一些向后兼容的增量更改(为了改进算术异常报告),因此关键字在 1.10 和 1.11 之间的二进制序列化发生了变化。
我们不保证在版本之间 Clojure 对象的二进制序列化兼容性,因此这里期望它们相同是不正确的。可以在 clj-uuid 中以多种方式处理这些问题,例如,通过为特定于 KeyWord 的 UUIDNameBytes 协议提供自定义序列化( https://github.com/danlentz/clj-uuid/blob/master/src/clj_uuid.clj#L557 ),或者寄希望于将对象流转换为字符串然后再转换为字节等。
我们可能通过将 clojure.lang.Keyword 的 serialversionUID 设置为 1.10 时的值来解决此特定问题(因为这些对象可能是二进制兼容的),我们还将更多考虑这一点。但即使我们这样做,我也建议为 clj-uuid 的局部名称部分使用更稳定的类型(如字符串)。