为啥 Comparator 应该实现 Serializable?

Posted

技术标签:

【中文标题】为啥 Comparator 应该实现 Serializable?【英文标题】:Why should a Comparator implement Serializable?为什么 Comparator 应该实现 Serializable? 【发布时间】:2012-01-28 08:17:49 【问题描述】:

Java 新手。在开发 android 应用程序时学习它。我正在实现一个比较器来对文件列表和比较器应该实现可序列化的 android 文档say 进行排序:

建议 Comparator 实现 Serializable。

这是可序列化接口here。

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

【问题讨论】:

为什么 Android 会关心序列化? @irreputable:你为什么不在 Android 上使用序列化? 【参考方案1】:

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

    实例所属的类必须实现 java.io.Serializable。 类的成员应该是可序列化的。如果一个或多个成员不被序列化,则应将它们标记为瞬态。

当任何数据结构使用 Comparator 并且您希望该数据结构可序列化时,第 2 点(如上所述)强制比较器实现可序列化。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

Serializeable 是一个空白接口。它不包含任何方法。所以,要实现它,你只需要在一个类中说implements Serializable。这对你来说不是很大的负担。如果你扩展Comparator,你甚至不需要实现Serializable,因为超类会为你做这件事,然后你根本不需要做任何事情来实现Serializable

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

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

【讨论】:

“如果你扩展 Comparator”:Comparator 是一个接口(并且不扩展 Serializable)。 “要实现它,你需要说的就是在一个类中实现 Serializable”,你还需要考虑这是否是正确的做法。例如,所有实例字段也需要可序列化(或者您需要采取一些措施)。【参考方案5】:

这不仅仅是 Android 的东西,Java SDK has the same recommendation:

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

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

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

【讨论】:

以上是关于为啥 Comparator 应该实现 Serializable?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的Comparable接口和Comparator接口

为啥 SERIAL 不能在 Postgres 中处理这个简单的表?

java排序问题,comparator接口,求高手

Java学习总结——(Map集合,Comparator接口,异常等)

一篇文章带你深入理解 Comparable 和 Comparator

为啥这个查询这么慢? - PostgreSQL - 从 SERIAL、TIMESTAMP 和 NUMERIC(6,2) 中选择