2011-12-27 180 views
36

Java新手。在Android应用上工作时学习它。我正在实现一个比较器来对文件列表和比较器应该实现的Android文档say进行排序可串行化:比较器为什么要实现Serializable?

建议比较器实现Serializable。

这是可序列化接口here

我只想对文件列表进行排序。为什么我应该实现这个目标,甚至为什么它应该用于比较器?

+0

为什么Android会关心序列化呢? – irreputable 2011-12-27 07:27:46

+2

@irreputable:你为什么不在Android上使用序列化? – Thilo 2011-12-27 07:38:53

回答

47

这不只是一个Android的东西,Java SDK has the same recommendation

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

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

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

9

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

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

8

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

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

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

+3

“如果扩展比较器”:比较器是一个接口(并且不扩展Serializable)。 “要实现它,所有你需要说的是在一个类中实现Serializable”你还需要考虑这是否是正确的事情。例如所有实例字段也需要可序列化(或者您需要采取一些措施)。 – Thilo 2011-12-27 07:36:33

0

我已经看到了在Java 5中API Link to java 5 APT 其中指出,通过实施比较并不意味着反正实现Serializable接口,所以一个个有明确关注获得一些习惯产生比较级序列化

3

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

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

当任何数据结构使用比较器,并且希望该数据结构可序列化时,第2点(上面提到的)迫使比较器实现可串行化。