关于TreeSet集合进行匿名实现Comparator接口无法序列化
需求
把自定义类按照某个字段排序,并存储到集合中,然后把类存储到文件中。
实现
定义stu类,并继承Serializable接口序列化
class Stu implements Serializable{
private Integer id;
private String name;
private Integer age;
public static final long serialVersionUID = 1L;
public Stu() {
}
public Stu(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
我使用TreeSet集合存储stu类,按照age排序
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
TreeSet<Stu> treeSet=new TreeSet<>(new Comparator<Stu>() {
结果:在把集合写入文件中,报了序列化问题
出现了”没有序列化异常“,找了很久我的Stu也现实了序列化接口,最后问题出现在了我写的比较器上。
我实现的是匿名内部类Comparator接口,但是java.text.RuleBasedCollator实现了Comparator接口但是却不支持Serializable接口,就是Comparator没有实现Serializable接口导致序列化失败。
解决办法:
1.不适用匿名内部类Comparator接口在类中继承Comparable接口,实现compareTo()方法
class Stu implements Serializable,Comparable{
private Integer id;
private String name;
private Integer age;
public static final long serialVersionUID = 1L;
public Stu() {
}
public Stu(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
2.使用AarryList作为中间集合,把TreeSet添加到List集合中,在进行对象流写入
List<Stu> list=new ArrayList<>(treeSet);