文档章节

Java序列化(Serialization)的理解

NealFeng
 NealFeng
发布于 2013/10/20 20:20
字数 1626
阅读 288
收藏 4
点赞 1
评论 0

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


  Ivor Horton's Beginning Java(Java 7 Edition By Ivor Horton)  Chapter 12  Serializing Object
  http://cn.bing.com/search?q=beginning+java+java+7+edition&go=&qs=AS&form=QBRE&pq=beginning+java+java&sc=2-19&sp=1&sk=

© 著作权归作者所有

共有 人打赏支持
NealFeng
粉丝 25
博文 55
码字总数 36482
作品 0
朝阳
程序员
java中的Serializable接口的作用

实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。   序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和...

java梦想家01
2015/07/07
0
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
07/16
0
0
java serializable深入了解

一、串行化(序列化)的概念和目的 1. 什么是Serialization? 串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内在缓冲区等)中或是以二进制方式通过网络传...

亚特兰缇斯
2015/03/04
0
0
spark 持久化 cache和persist的区别

cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间。 cache和persist的区别 基于Spark 1.4.1 的源码,可以看到 说明是cache...

zyzzxycj
04/20
0
0
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

06/10
0
0
为什么我墙裂建议大家使用枚举来实现单例

我们知道,单例模式,一般有七种写法,那么这七种写法中,最好的是哪一种呢?为什么呢?本文就来抽丝剥茧一下。 哪种写单例的方式最好 在StakcOverflow中,有一个关于What is an efficient ...

冷_6986
06/13
0
0
Java学习资料-标识符、关键字

1、标识符 (1)Java对各种变量、方法和类等要素命名时使用的字符序列称为标识符。凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则。 (2)Java标识符命名规则: 标识符由字母、下划...

晓阳
2015/01/05
0
0
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神
05/08
0
0
动车上的书摘-java对象流与序列化

动车上的书摘-java对象流与序列化 摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 钢笔不限贵便宜,书法是来自心对手的交流。-泥沙砖瓦...

泥沙砖瓦浆木匠
2014/07/17
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Win10专业版安装GIT后使用Git Bash闪退解决办法

百度后把过程和最终解决办法记录下来: 百度首先出来的解决办法如下: 来自:https://segmentfault.com/q/1010000012722511?sort=created 重启电脑 重新安装 安装到C盘 尝试网上的教程 \Git...

特拉仔
12分钟前
0
0
设计模式

1.装饰器模式 概念 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。 实现 增加一个修饰类包裹原来的...

EasyProgramming
27分钟前
1
0
用python2和opencv进行人脸识别

一、安装cv2 sudo apt-get install python-opencv opencv-data 二、 Haar特征分类器 Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 ...

wangxuwei
27分钟前
0
0
python模板中循环字典

{% for k,v in user.items %} {{ k}} {{ v}} {% endfor %}

南桥北木
56分钟前
0
0
Java8系列之重新认识HashMap

简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类...

HOT_POT
59分钟前
0
0
获取调用方的className

/** * 获取调用方的class * @return */private static String getInvoke() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); S......

iborder
今天
0
0
深入了解一下Redis的内存模型!

一前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符...

Java填坑之路
今天
1
0
从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加。在这个背景下,平台的技术架构也完成了从传统的单体应用到微...

老道士
今天
1
0
大数据学习的各个阶段

第一阶段:Linux课程讲解Linux基础操作,讲的是在命令行下进行文件系统的操作,这是Hadoop学习的基础,后面的所有视频都是基于linux操作的。鉴于很多学员没有linux基础,特增加该内容,保证零linux...

董黎明
今天
0
0
CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部