比较器为什么要实现Serializable?

时间:2011-12-27 07:06:30

标签: java android sorting serialization comparator

Java新手。在使用Android应用程序时学习它。我正在实现一个Comparator来排序一个文件列表和一个Comparator应该实现Serializable的android文档say

  

建议Comparator实现Serializable。

这是Serializable接口here

我只想对文件列表进行排序。我为什么要实现这个,或者为什么它应该适用于任何比较器呢?

5 个答案:

答案 0 :(得分:49)

这不仅仅是Android的事情,Java SDK has the same recommendation

  

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

所以我的想法是因为TreeMap是可序列化的,并且TreeMap可以包含一个Comparator,如果Comparator也是可序列化的,那将是很好的。这同样适用于集合中的所有元素。

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

答案 1 :(得分:9)

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

  
    

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

  

答案 2 :(得分:9)

Serializeable是一个空白界面。它不包含任何方法。因此,要实现它,您需要说的是implements Serializable在类中。这对你来说不是一个巨大的负担。如果您延长Comparator,您甚至不需要实施Serializable,因为超级类会为您执行此操作,然后您根本不需要执行任何操作来实现Serializable {1}}。

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

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

答案 3 :(得分:3)

要在Java中序列化对象,应满足以下两个条件:

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

答案 4 :(得分:0)

我在Java 5 API中看到过 Link to java 5 APT 这表明通过实现Comparator并不意味着无论如何都要实现Serializable接口,因此必须明确注意在一些习惯上创建的Comparator类中获取Serializable