关于JAVA中TreeMap集合使用匿名内部类Comparetor自定制比较器排序无法序列化的问题

今天在帮别人解决问题的时候发现,在使用匿名内部类来自定义Comparetor比较器来给TreeMap集合排序的之后,无法再序列化的问题。

具体如下:
首先有了一个Student类,包含id(int),name(String),sex(String)属性。
然后在test中创建TreeMap集合,定制Comparator比较器并添加数据具体如下图:
排序后结果

匿名内部类Comparator使用了lamabda表达式,原来代码如下:
TreeMap<Integer, Student> map = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});

然后序列化时出现异常如下(此时Student类已经实现Serializable接口):
错误日志

经过查找资料发现:
为了能够序列化Treemap和TreeSet,那么它们所拥有的Comparators必须支持Serializable接口。而java.text.RuleBasedCollator实现了Comparator接口但是却不支持Serializable接口,这样导致了拥有RuleBasedCollator的TreeMap实例无法进行序列化。简单来说就是Comparator没有实现Serializable接口导致序列化失败。

解决方案:
1.通过单独写一个Comparator比较器类来实现Serializable接口(不提供具体代码啦。。。)

2.通过在Student类中实现Comparable接口,重写comparato方法来完成排序代码如下:

public class Student implements Comparable<Student>,Serializable{

    private static final long serialVersionUID = 1L;

    private int id;
    private String name;
    private String sex;

    public Student() {
        // TODO Auto-generated constructor stub
    }

    public Student(int id, String name, String sex) {
        super();
        this.id = id;
        this.name = name;
        this.sex = sex;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]";
    }

    @Override
    public int compareTo(Student o) {
        return this.id - o.getId();
    }



}

执行结果如下:
序列化成功

总结:
为了代码方便,以后对排序后的TreeSet和TreeMap都用对象类实现Comparable的方法来排序把。。。

猜你喜欢

转载自blog.csdn.net/a754895/article/details/82527908