为啥要实现Serializable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥要实现Serializable相关的知识,希望对你有一定的参考价值。

在一些类中,为什么要实现Serializable接口?它的作用是什么?什么时候用?谢谢。如public class UpSend implements Serializable

最重要的两个原因是:

1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;

2、按值将对象从一个应用程序域发送至另一个应用程序域。

实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列化。

扩展资料:

public interface Serializable类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

要允许不可序列化类的子类型序列化,可以假定该子类型负责保存和还原超类型的公用 (public)、受保护的 (protected) 和(如果可访问)包 (package) 字段的状态。仅在子类型扩展的类(父类)有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此责任。

如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。

在反序列化过程中,将使用该类的公用或受保护的无参数构造方法初始化不可序列化类的字段。可序列化的子类必须能够访问无参数的构造方法。可序列化子类的字段将从该流中还原。

参考资料:百度百科-serializable接口

参考技术A 如果是字符串在网络通信一般可以直接传输,如果是对象需要序列化,为的是变为二进制来传输 参考技术B 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。 参考技术C   最重要的两个原因是:
  1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;
  2、按值将对象从一个应用程序域发送至另一个应用程序域。

  实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列化。
参考技术D 序列化接口,便于在网络上进行传输的,其它时候可以不用

为啥 Comparator 应该实现 Serializable?

【中文标题】为啥 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 也是可序列化的就好了。这同样适用于集合中的所有元素。

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

【讨论】:

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

HttpServlet为啥要实现Serializable?

为啥TensorFlow要重新实现很多数学方程?

如果不能保证调用 onDestroy() ,为啥要实现它?

为啥我们要“使用 2 个堆栈实现一个队列”? [复制]

在 C++11 标准中,为啥要依赖 char 类型的实现?

为啥我们要实现标记接口,即使它们不包含任何方法? [复制]