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已经提供了实现序列化需要的相关代码,所以大部分情况下,使用序列化很简单。例如:

保存对象:

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

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

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

比如Java API中的Character类:

java oracle序列化_Java序列化(Serialization)的理解相关推荐

  1. java序列化_Java序列化详解

    什么是序列化? 在Java中,对象序列化表示将对象表示为字节序列.字节包括对象的数据和信息.可以将序列化的对象写入文件/数据库,然后从文件/数据库中读取并反序列化.代表对象及其数据的字节可用于在内存中 ...

  2. java实现序列化_java 序列化实现方式总结

    什么是序列化,可能大家都知道,但又不很清楚,呵呵,就像我一样,下面是一段百度百科的说明,说的很清楚,可以参考下 序列化 (serialization) 将对象的状态信息转换为可以存储或传输的窗体的过程 ...

  3. java string 反序列化_java序列化和反序列化

    引语: 平时我们在运行程序的时候,创建的对象都在内存中,当程序停止或者中断了,对象也就不复存在了.如果我们能将对象保存起来,在需要使用它的时候在拿出来使用就好了,并且对象的信息要和我们保存 时的信息一 ...

  4. java protostuff 好处_Java 序列化框架性能对比(kryo、hessian、java、protostuff)

    简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff-Ru ...

  5. java 操作序列_JAVA序列化操作详解

    一.概述 很多时候我们需要将对象的信息以文件的形式存储到硬盘上以便以后可以恢复使用.我们可以按照一定的格式将变量的值依次写到特定格式的文件中.但有时候我们希望只有我们自己可以读懂它并且修改它,这就是序 ...

  6. java 变量序列化_Java序列化与静态变量

    简介: Java序列化,就是指将一个对象转化为二进制的byte流(注意,不是bit流),然后以文件的方式进行保存. 序列化操作:将对象保存至文件: 反序列化操作:从文件恢复出对象: 配置: 对象如果要 ...

  7. java list反序列化_java序列化与反序列化操作实例分析

    本文实例分析了java序列化与反序列化操作.分享给大家供大家参考,具体如下: 概述: Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程. ...

  8. java serializable用法_JAVA序列化Serializable及Externalizable区别详解

    序列化简介 Java 的对象序列化将那些实现 Serializable 接口的对象转换成一个字节序列,并能在之后将这个字节序列完全恢复为原来的对象. 这就意味着 Java 对象在网络上的传输可以不依赖 ...

  9. java文件序列化_Java序列化与反序列化,文件操作

    参考两篇博客: http://blog.csdn.net/moreevan/article/details/6697777 http://blog.csdn.net/moreevan/article/ ...

最新文章

  1. 激光SLAM如何帮助自动驾驶准确定位和建图?
  2. 32位浮点数在威纶触摸屏显示_MCGS触摸屏与与西门子 S7-1200 PLC以太网通讯
  3. BSS段,数据段,代码段,堆内存和栈
  4. ubuntu下命令行启动vmware某个虚拟机
  5. 前端学习(2684):重读vue电商网站5之登录页面总结如何进行表单验证
  6. 麓山滨江2021高考成绩查询,长沙2021高考成绩排名榜单,长沙各高中高考成绩喜报...
  7. 在Rails资产管道中使用字体
  8. LT8918 BT1120转mipi dsi/mipi csi;提供技术支持
  9. Solidworks教程:利用Simulation模拟热传导
  10. 51单片机系列--led点阵屏显示汉字
  11. 百合佳缘伐谋、珍爱网伐交、伊对伐兵
  12. 2008~2009流行歌曲
  13. 电脑如何共享无线网络wifi给手机、其他电脑
  14. 使用python定义简单工资扣税实际收入函数
  15. 华为云对象存储服务OBS教你一招轻松解决存储难题
  16. RFID在固定资产盘点系统中的应用
  17. vue2-element,vue3-element-plus 的列表翻页的序号
  18. 【备品备件】入库流程--赠品入库,商贸入库和退库入库
  19. 【名字无关紧要,实战才是唯一】——吾神·娜迦卡布洛斯
  20. Erlang词法分析器、语法分析器(lexer-leex,yac-yecc)

热门文章

  1. 填写数独 洛谷P1784
  2. 路由器连接宽带(成功上网步骤方法)
  3. [安全测试报告]针对某厂商的一次渗透性测试
  4. linux之crontab使用技巧
  5. python动态创建字典_如何在Python中创建动态命名字典?
  6. 代码评审常见问题总结【持续更新】
  7. 论如何使用zabbix监控LNMP架构
  8. 执行shell脚本报/bin/bash^M: bad interpreter
  9. StringBuilder对象扩展
  10. 抢占计算机与通信设备未来产业制高点 ——《信息产业发展指南》解读