作者:gigi-dd | 来源:互联网 | 2023-09-23 11:29
今天在帮别人解决问题的时候发现,在使用匿名内部类来自定义Comparetor比较器来给TreeMap集合排序的之后,无法再序列化的问题。具体如下:首先有了一个Student类,包含
今天在帮别人解决问题的时候发现,在使用匿名内部类来自定义Comparetor比较器来给TreeMap集合排序的之后,无法再序列化的问题。
具体如下:
首先有了一个Student类,包含id(int),name(String),sex(String)属性。
然后在test中创建TreeMap集合,定制Comparator比较器并添加数据具体如下图:
匿名内部类Comparator使用了lamabda表达式,原来代码如下:
TreeMap map = new TreeMap<>(new Comparator() {
@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,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的方法来排序把。。。