Java序列化比较器

问题描述 投票:1回答:5

是否可以使用比较器序列化TreeMap?

我已经测试过,它可以很好地序列化没有比较器的树图,当您添加比较器时,它会引发异常。

如果我将比较器声明为瞬态的,它仍然不起作用。仅当我使每个树图都变为瞬态时,它才起作用,但在这种情况下,它不对树进行序列化。

java serialization comparator
5个回答
8
投票

您尝试序列化的所有类都必须实现java.io.Serializable接口。另外,您班上的每个成员变量都应为Serializable。实际上,您的整个层次结构应该是。


0
投票

要获得更多帮助,请查看this。其他要考虑的内容(如本文档和其他地方提到的):

  • 版本
  • 对象的自定义序列表
  • 您的对象的哪些字段应该序列化,哪些是transient

0
投票

TreeMap在这里没有做任何特别的事情。如果序列化的TreeMap与未序列化的TreeMap之间的唯一区别是您的比较器...,则您的比较器无法序列化。

您如何实现比较器?对于没有瞬时引用的TreeMap类,您的瞬时声明是没有意义的。

例外说明什么?


0
投票

java.util.TreeMap没问题,您的comparator可能​​是问题。

您需要做的就是重写比较器类

// throws a 'java.io.NotSerializableException'
class ThisIsNotSerializable implements Comparator<String> {
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
}

class ThisIsSerializable implements Comparator<String>, Serializable {
    private static final long serialVersionUID = -5972458403679726498L;

    public int compare(String arg0, String arg1) {
        return arg0.compareTo(arg1);
    }
}

更多信息&source


-1
投票

您可能会发现,就像将Comparator字段更改为静态成员而不是实例成员一样简单:

public final static Comparator<String> ID_IGN_CASE_COMP

您将需要确保所有其他字段都是可序列化的,但这应该是一个开始。

© www.soinside.com 2019 - 2024. All rights reserved.