为啥要序列化

Posted

tags:

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

a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。
  我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。

 b.另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。  
例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。
 公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
参考技术A 说白了就是为了保证数据传输的安全性,以免发生意外时数据丢失。
序列化说白了就是将数据转成字节型数组然后传输。
参考技术B 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。

说的再直接点,序列化的目的就是为了跨进程传递格式化数据本回答被提问者采纳

序列化可以进行定制,那么为啥要 Externalizable 呢?

【中文标题】序列化可以进行定制,那么为啥要 Externalizable 呢?【英文标题】:customization is possible with serialization then why Externalizable at all?序列化可以进行定制,那么为什么要 Externalizable 呢? 【发布时间】:2014-03-31 11:11:24 【问题描述】:

我在SO阅读了这些文章:

Externalizable or Serializable?,

What is the difference between Serializable and Externalizable in Java?.

但我的问题是,与 serializable 相比,通过实施 Externalizable 可以获得哪些额外的自定义。

通过提供我们自己的writeObjectreadObject 实现,可以自定义实现SerializableclassSerialization。那么使用Externalizable 并自定义ReadExternalwriteExternal 实现的目的是什么。使用Externalizable 的真正好处是什么?我读过各种链接,上面写着Externalizable 支持自定义serialization(包括上面的那个)。但我没有看到Externalizable 是明显赢家的例子,或者使用Serializable 无法完成的事情。很高兴看到一个例子。

为了更清楚起见,以下 sn-p 是从here 中提取的:

class 实现Serializable interface 时,它会向JVM 提供这些classes 中的instances 可以序列化的信息。除此之外,JVM 有一个特别说明

“在实现Serializable的类中查找以下两个方法。如果找到,则调用它并继续序列化过程,否则直接遵循标准序列化协议”

所以这给了我们写这两个方法的机会:

private void writeObject(ObjectOutputStream out) throws IOException;, private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

在实现SerializableClass 内部,您将获得serialization 进程的挂钩。您可以在这两个方法中编写自定义代码,并自定义serialization 的标准行为。

【问题讨论】:

【参考方案1】:

Serializable 和 Externalizable 的主要区别在于 Serializable 会自动为您处理基类。 Externalizable 将整个工作交给您。

【讨论】:

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

实体类为啥要序列化

为啥要序列化

Java中序列化作用是啥?为啥要序列化?

javabean为啥要实现序列化

android activity之间传递对象 对象为啥要序列化

反序列化为啥要找公开方法