1、什么是序列化

  Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象。由于这种需求很常见,所以Java API对此提供了支持,添加相关程序代码到标准类库中,并将保存和还原的过程称之为“对象序列化”。 
  Java SE7 文档中将与对象序列化的相关内容做了详细表述,将其称为: 
  “Java对象序列化规范”  Java Object Serialization Specification,网址为: 
  http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html

2、为什么叫序列化

  个人猜测: 
  由于保存对象的过程,是把对象保存为一连串字节流,而英文Serialization的意思“序列化”,所以序列化形象的表述了这个过程。

3、序列化保存那些内容

  对象(object)是类(class)的一个实例(instance)。一个类中包含了变量(field)和函数(method)两个部分。同一个类的不同对象只是变量不同,所以Java API序列化过程中只保存了对象的变量部分。同样,由于静态变量(static field)是由同一个类的各个对象共用的,所以序列化过程中也不保存。 
  由于还原对象时需要在程序中动态创建该对象,所以程序也需要知道该对象的类定义,所以如果对象由一个程序序列化保存之后,由另外一个程序反序列化还原时,类文件也需要传送给该程序。这就需要扩展Java API序列化的功能,对其进行自定义。Java的远程方法调用(Remote Method Invocation, RMI)功能,就是以Java API序列化为基础,并进行了扩展。

3、序列化的用途

 序列化主要有三个用途:

  • 对象持久化(persistence)

  对象持久化是指延长对象的存在时间。通常状况下,当程序结束时,程序中的对象不再存在。 
  如果通过序列化功能,将对象保存到文件中,就可以延长对象的存在时间,在下次程序运行是再恢复该对象。 
  序列化将对象保存在文件中,是实现对象持久化的一种方式。持久化还有很多种方式,比如Hibernate框架就提供了一整套对象持久化的方案。

  • 对象复制

  通过序列化,将对象保存在内存中,可以再通过此数据得到多个对象的副本。

  • 对象传输

  通过序列化,将对象转化字节流后,可以通过网络发送给另外的Java程序。

4、什么是流(Stream)

  Java是面向对象的编程语言,对象是对现实实体的抽象表述。所以Java API中流(Stream)是对一连串数据的抽象,同时定义了一些操作,write和read等。所以现实实体,只要包含数据和对数据的读写操作都可以表示为流。OutputStream类和InputStream类,是2个抽象类,分别对应输出、输入流,所有其它流对象,都是其子类。 
  比如文件,文件本质是保存在存储设备中的一连串数据,在Java API中抽象为FileOutputStream类和FileInputStream类,文件的读写可以通过对相应流的读写实现的。 
  比如控制台中命令和结果的输入输出,键盘的输入是一串数据,程序的输出是一串数据,所以在Java API中也被抽象为流对象。控制台输入由System.in对象体现,System.in是类型为InputStream的对象。控制台输出由System.out对象体现,System.out是类型为PrintStream的对象。 
  由于文件和控制台输入输出都和操作系统有关,所以文件流和控制台流对象最终都是由Java虚拟机创建的。 
  ByteArrayOutputStream、ByteArrayInputStream,是完全不依赖Java虚拟机的流对象,其完全是对一个byte[]数组的抽象。因为byte[]数组也是一连串数据,byte[]数组支持读写功能,所以完全可以抽象为流对象,这可以从这两个类的源代码中看出。

4、使用序列化功能

  在Java API中,对象序列化接口主要由两个类提供:ObjectOutputStream,ObjectInputStream。 
  为了满足保存到文件、内存、通过网络传输等不同需求,对象序列化后保存在流对象中。提供不同的流对象时,序列化后保存在相应流对象中。比如提供FileOutputStream和FileInputStream,就保存在文件中;提供ByteArrayOutputStream、ByteArrayInputStream,就保存在内存中。 
  由于Java API已经提供了实现序列化需要的相关代码,所以大部分情况下,使用序列化很简单。例如: 
  保存对象:

//创建一个流对象,比如文件输出流对象
FileOutputStream underlyingStream = new FileOutputStream("C:\\temp\\test");
//用刚才的文件流,创建一个对象序列化输出流
ObjectOutputStream serializer = new ObjectOutputStream(underlyingStream);
//使用该流的输出函数,将对象序列化后保存到文件流中,也就是保存到了对应文件中。
serializer.writeObject(serializableObject);

  读取对象,操作完全与保存是一一对应:

//创建一个流对象,比如文件输入流对象
FileInputStream underlyingStream = new FileInputStream("C:\\temp\\test");
//用刚才的文件流,创建一个对象序列化输入流
ObjectInputStream deserializer = new ObjectInputStream(underlyingStream);
//使用该流的输入函数,将文件中保存的对象读取到内存中,并创建相应对象。
Object deserializedObject = deserializer.readObject(  );

5、什么样的类可以序列化

  不是所有的类都有序列化的必要,比如Thread类等,这些类中并没有必要保存的信息。这也是序列化没有成为Java内部功能的原因之一。所以,如果某个类需要序列化功能,类的定义中必须实现Serializable或者Externalizable接口。 
  比如Java API中的Character类:

public final
class Character implements java.io.Serializable, Comparable<Character>

6、进一步的内容

  进一步的内容比如transient关键字、自定义序列化机制、序列化版本控制等,请参考以下文章:

  Java RMI  Chapter 10  Serialization  By William Grosso 
  http://oreilly.com/catalog/javarmi/chapter/ch10.html

  Discover the secrets of the Java Serialization API   by Todd Greanier 
  http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html

感谢http://my.oschina.net/u/1382972/blog/170148

JAVA之序列化(Serialization)的理解相关推荐

  1. Java序列化(Serialization)的理解

    2019独角兽企业重金招聘Python工程师标准>>> 1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以J ...

  2. java oracle序列化_Java序列化(Serialization)的理解

    1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以Java API对此提供了支持,添加相关程序代码到标准类库中,并将保存和还原 ...

  3. 深入理解Java对象序列化

    关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...

  4. 理解Java对象序列化

    理解Java对象序列化 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在 ...

  5. 理解Java对象序列化——Serializable接口

    概述:当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以. ...

  6. java 序列化理解_对Java Serializable(序列化)的理解和总结(二)

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,se ...

  7. 代码即财富之我学Java对象序列化与反序列化(2)

    2019独角兽企业重金招聘Python工程师标准>>> 我们在程序创建的Java对象都是存在于JVM内存中的,也就是Java对象的生命周期一定不会长于JVM,所以如何以一种持久化的方 ...

  8. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  9. 关于 Java 对象序列化您不知道的 5 件事

    数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...

最新文章

  1. Spring Boot第四篇:SpringBoot 整合JPA
  2. cad细等线体不显示_CAD打印文字不显示?很多人不知道这个知识点!
  3. another CRM inbound debug - 另一个CRM中间件的调试记录
  4. Mysql案例5:取得平均薪资最高的部门的部门名称
  5. 不止音箱,百度还发布了这些AI产品,还有参会者的10个小建议
  6. java设计模式----简单工厂
  7. oracle递归树查询
  8. Gradle插件开发- 无侵入的函数运行时间统计的实现
  9. 关于wxwidgets图形界面的关闭窗口的按钮无效的解决办法
  10. react异常 Each child in a list should have a unique “key” prop
  11. bi 工具 市场排行榜_bi工具市场排行榜,国内BI软件排名
  12. 编写一个能将给定非负整数列表中的数字排列成最大数字的函数。
  13. linux的帮助,帮助信息_Linux公社 - Linux系统门户网站
  14. 首先下载安装data.table包_首次揭秘“超级签”与企业包行业内幕
  15. 《VR/AR技术与应用》笔记 002
  16. iptables目标TTL
  17. 提高微信公众号推文阅读数小妙招
  18. Excel小技巧----VLOOKUP数据匹配
  19. 教师一定要看的15部电影
  20. 如何运用AI聊天机器人,助推内容营销活动取得成功?

热门文章

  1. 游戏服务器世界聊天系统,7.2 世界聊天系统实现
  2. 公务员备考(十六)行测 判断推理
  3. 超好用的Android高亮引导库
  4. 奇亿音乐2018年终总结:全心全意为你而声
  5. ubuntu 编译 jdk (二)
  6. Mac XCode链接苹果手机iPhone总是不断连接断开、断断续续的解决方法
  7. JAVA Timer()实现可重置计时器
  8. 迁移学习的基本概念、使用场景与方法
  9. vue 集成 sweetalert2 提示组件
  10. 计算机所王颖简历,王颖-天津大学材料科学与工程学院