为啥 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学习总结——(Map集合,Comparator接口,异常等)
一篇文章带你深入理解 Comparable 和 Comparator
为啥这个查询这么慢? - PostgreSQL - 从 SERIAL、TIMESTAMP 和 NUMERIC(6,2) 中选择