我需要序列化一个包含TreeSet的类,它有一个自定义比较器(byte []不可比较)。
当我尝试用Gson(v2.3.1)反序列化类时,我得到:
Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1290)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)....
因此,使用比较器不会反序列化TreeSet。
该课程如下:
public class In {
private final SortedSet<byte[]> keys = new TreeSet<>(new ByteKeyComparator());
}
有没有办法让Gson明白它需要一套比较器呢?
答案 0 :(得分:0)
你是对的,它是一个序列化错误。但是,它与Gson无关,实际上您的自定义比较器是被保留。
问题在于TreeMap.put(K,V)
的实现与空TreeSet的反序列化行为相结合,这导致支持映射具有空root
。如果TreeMap的根节点为空并且您放置了一个键/值对,它将忽略配置的比较器。
要解决您的问题,请跳过序列化空TreeSet
s。