Java序列化(Serialization)的理解

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

?


1

2

3

4

5

6


//创建一个流对象,比如文件输出流对象

FileOutputStream underlyingStream =
new
FileOutputStream(
"C:\\temp\\test"
);

//用刚才的文件流,创建一个对象序列化输出流

ObjectOutputStream serializer =
new
ObjectOutputStream(underlyingStream);

//使用该流的输出函数,将对象序列化后保存到文件流中,也就是保存到了对应文件中。

serializer.writeObject(serializableObject);

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

?


1

2

3

4

5

6


//创建一个流对象,比如文件输入流对象

FileInputStream underlyingStream =
new
FileInputStream(
"C:\\temp\\test"
);

//用刚才的文件流,创建一个对象序列化输入流

ObjectInputStream deserializer =
new
ObjectInputStream(underlyingStream);

//使用该流的输入函数,将文件中保存的对象读取到内存中,并创建相应对象。

Object deserializedObject = deserializer.readObject(  );

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

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

?


1

2


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=

时间: 2024-10-14 13:04:48

Java序列化(Serialization)的理解的相关文章

初探Java序列化(Serialization)

Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化Deserialization是一种将这些字节重建成一个对象的过程.[字节流的来回转换] Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端.这就需要有一种可以在两端传输数据的协议.Java序列化机制就是为了解决这个问题而产生. 将对象状态转换成字节流之后,可以用java.io包中各种字节流的类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序

java序列化对象简单理解

1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象.Java对象序列化就能够帮助我们实现该功能. 使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象.必须注意地是,对象序列化保存的是对象的"状态",

初探Java序列化(2)-writeObject/readObject

上一篇<初探Java序列化(Serialization)>给我们大体介绍了什么是序列化和反序列化,以及解析了一下序列化出来的文件.接着我们看看JDK具体如何序列化一个Object. 在序列化过程中,虚拟机会试图调用对象类里的writeObject() 和readObject(),进行用户自定义的序列化和反序列化,如果没有则调用ObjectOutputStream.defaultWriteObject() 和ObjectInputStream.defaultReadObject().同样,在Ob

Java Serializable(序列化)的理解和总结、具体实现过程(转)

原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=13576&fromuid=3402 Java Serializable(序列化)的理解和总结.具体实现过程 内存中的对象是怎么存在的?  内存中各种对象的状态是?  实例变量是什么(指的是实例化的对象吗)?    使用序列化的好处是什么? 1.序列化是干什么的?        简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出

Java序列化(Serialization)

关于Java的序列化的文章在网上已经够多了,在这里写关于Java序列化的文章是对自己关于这方面的的一种总结,结合以前的开发经验与网上的资料,写了这篇文章,对自己是有着巩固记忆的作用,也希望能够对大家有一定帮助. 一.什么是序列化(Serialization)? 序列化是Java提供的一种机制,将对象转化成字节序列,在字节序列中保存了对象的数据.对象的类型的信息与存储在对象中的数据的类型.序列化实际上就是将保存对象的"状态",可以方便以后的程序使用或者通过网络传输到另一台主机使用.一般来

对Java Serializable(序列化)的理解和总结(转)

转自:https://www.cnblogs.com/qq3111901846/p/7894532.html 1.序列化是干什么的?       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 2.什么情况下需要序列化       a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候: 

Java序列化的理解与学习

1.什么是Java序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比 JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象.Java对象序列 化就能够帮助我们实现该功能. 必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量.由此可知,对象序列化不会关注类中的静态变量. 所谓序列化其实就是将程序中的数据(对

Java序列化算法

Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.java序列化API提供一种处理对象序列化的标准机制. 序列化的必要性 java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端.这就需要有一种可以在两端传输数据的协议.java序列化机制就是为了解决这个问题而产生. 如何序列化一个对象 一个对象能够序列化的前提是实现Serializable接口,Serializ

java序列化---转

Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Seriali