关于java:比较器为什么要实现Serializable?

Why should a Comparator implement Serializable?

Java新手。 在Android应用程序上工作时进行学习。 我正在实现一个Comparator来对文件列表进行排序,而android docs说一个Comparator应该实现Serializable:

It is recommended that a Comparator implements Serializable.

这是此处的可序列化接口。

我只想对文件列表进行排序。 我为什么要实施此方法,或者为什么对任何比较器都应采用该方法?


这不仅是Android的事情,Java SDK也有相同的建议:

Note: It is generally a good idea for comparators to also implement java.io.Serializable, as they may be used as ordering methods in serializable data structures (like TreeSet, TreeMap). In order for the data structure to serialize successfully, the comparator (if provided) must implement Serializable.

因此,想法是因为TreeMap可序列化,并且TreeMap可以包含Comparator,所以如果Comparator也可序列化将是很好的。集合中的所有元素也是如此。

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


可序列化是一个空白接口。它不包含任何方法。因此,要实现它,您只需要在类中说implements Serializable。这对您来说不是很大的负担。如果扩展Comparator,则甚至不需要实现Serializable,因为超类为您完成了该任务,因此您根本不需要执行任何操作来实现Serializable

当某些东西实现Serializable时,这意味着可以随意将对象转换为字节数组。这用于通过Internet传输,存储在文件中等。粗略地说,对象的序列化工作方式默认情况下是获取您要序列化的对象引用的每个对象,然后将每个对象对象分成一个字节数组(即,递归调用该对象的序列化),然后将字节数组连接起来以生成一个代表整个对象的字节数组。

现在,为什么Comparator应该实现Serializable?假设您希望序列化TreeMap或其他一些有序的Collection。序列化的目的是提供对象的完整表示。像TreeMap这样的集合中都有一个Comparator对象,因此,为了能够生成捕获此类集合各个方面的字节数组,您还必须能够将Comparator保存为字节数组。因此,Comparator必须为Serializable,以便可以正确地序列化其他内容。


这应该可以帮助您:http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

Note: It is generally a good idea for comparators to implement java.io.Serializable, as they may be used as ordering methods in serializable data structures (like TreeSet, TreeMap). In order for the data structure to serialize successfully, the comparator (if provided) must implement Serializable.


要序列化Java中的对象,必须满足以下两个条件:

  • 实例所属的类必须实现java.io.Serializable。
  • 该类的成员应可序列化。如果一个或多个成员不被序列化,则应将其标记为瞬态。
  • 当任何数据结构使用比较器并且您希望该数据结构可序列化时,第2点(如上所述)将迫使比较器实现可序列化。


    我已经在Java 5 API中看到了
    链接到Java 5 APT
    其中指出,实施Comparator并不意味着一定要实现Serializable接口,因此必须明确注意要在某些习惯创建的Comparator类中获取Serializable