为什么比较器要实现Serializable?

Java新手 在Android应用程序上工作时学习它。 我正在实现一个比较器来对文件列表进行sorting,而android文档则说比较器应该实现Serializable:

build议比较器实现Serializable。

这是这里的Serializable接口。

我只想对文件列表进行sorting。 我为什么要实现这个function,甚至是为什么它应该为比较器?

这不仅仅是一个Android事物, Java SDK也有相同的build议 :

注意:对于比较器来说,实现java.io.Serializable也是一个好主意,因为它们可以用作序列化数据结构(如TreeSet,TreeMap)中的sorting方法。 为了使数据结构成功序列化,比较器(如果提供)必须实现Serializable。

所以这个想法是因为一个TreeMap是可序列化的,并且TreeMap可以包含一个比较器,所以如果比较器也是可序列化的就好了。 这同样适用于集合中的所有元素。

除非以这种方式使用序列化,否则可以放心地忽略这个。

这应该会帮助你: http : //docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

注意:比较器实现java.io.Serializable通常是一个好主意,因为它们可以用作序列化数据结构(如TreeSet,TreeMap)中的sorting方法。 为了使数据结构成功序列化,比较器(如果提供)必须实现Serializable。

Serializeable是一个空白的界面。 它不包含任何方法。 所以,要实现它,所有你需要说的是在一个类中implements Serializable 。 这不是一个巨大的负担。 如果你扩展Comparator ,你甚至不需要实现Serializable因为超类为你做了这些,然后你不需要做任何事情来实现Serializable

当某些东西实现了Serializable ,这意味着对象可以随意变成一个字节数组。 这用于在因特网上传输,在文件中存储等。非常粗略地说,序列化对于对象的工作方式,默认情况下是将所尝试序列化的对象引用的每个对象,将每个对象将对象转换为字节数组(即recursion地调用串行化),并连接字节数组以产生表示整个对象的字节数组。

现在,为什么Comparator实现Serializable ? 假设你想序列化一个TreeMap或其他有序的Collection 。 序列化的目标是提供一个对象的完整表示。 像TreeMap这样的集合在其中有一个Comparator对象,所以为了能够生成一个捕获这些集合的每个方面的字节数组,您需要能够将Comparator作为一个字节数组来保存。 因此, Comparator需要可Serializable以便其他事情可以正确序列化。

要在Java中序列化一个对象,这两个条件应该得到满足:

  1. 实例所属的类必须实现java.io.Serializable。
  2. 这个类的成员应该是可序列化的。 如果一个或多个成员不被序列化,则应将其标记为暂时的。

当任何数据结构使用一个比较器,并且你希望这个数据结构是可序列化的,点2(上面提到的)迫使比较器实现可序列化。

我已经在Java 5 API Link中看到了Java 5 APT ,它规定通过实现Comparator并不意味着要实现Serializable接口,所以必须注意在一些通常创build的Comparator类中获得Serializable