欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-03 19:34:10
...

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

具体如下:
首先有了一个Student类,包含id(int),name(String),sex(String)属性。
然后在test中创建TreeMap集合,定制Comparator比较器并添加数据具体如下图:
关于JAVA中TreeMap集合使用匿名内部类Comparetor自定制比较器排序无法序列化的问题

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

然后序列化时出现异常如下(此时Student类已经实现Serializable接口):
关于JAVA中TreeMap集合使用匿名内部类Comparetor自定制比较器排序无法序列化的问题

经过查找资料发现:
为了能够序列化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();
    }



}

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

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

相关标签: java io