序列化是一种用来处理对象流的机制
所谓对象流:
就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题
序列化的实现:
将需要被序列化的类实现serializable接口(标机接口),该接口没有需要实现的方法,implements serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:fileOutputStream)来构造一个objectOutoutStream(对象流)对象;接着使用objectOutputStream对象的writeObject(object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输出流。
什么时候使用序列化:
1、对象序列化可以实现分布式对象
主要应用例如RMI(即远程调用Remote Method Invocation)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样
2、java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据
可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递,利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身,序列化一个对象可能得到整个对象序列
3、序列化可以将内存中的类写入文件或数据库中
比如:将某个类序列化后存为问价,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中,也可以将类序列化为流数据进行传输,总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中,并保留序列化时类中的所有变量和状态
4、对象、文件、数据有许多不同的格式,很难统一传输和保存
序列化以后就都是字节流了,无论是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件
因为java中要将对象序列化为流的形式进行传输
对象的序列化就是为了数据传输,在你的代码的里是对象格式,而在传输的时候不可能还保持这对象的样子。
当两个进程再进行远程通信时,彼此可以发送各种类型的数据,无论是何种类型的数据都会以二进制序列的形式在网络上传输,发送方需要将这个java对象转换为字节序列才能在网络上传送,接收方则需要把字节序列再恢复为java对象
1、概念
序列化:把java对象转换为字节序列的过程
反序列化:把字节序列恢复为java对象的过程
2、用途:
a、把对象的字节序列永久的保存到硬盘上,通常放在一个文件中
b、在网络上传输对象的字节序列
- 所谓的serializable,就是java提供的通用数据保存和读取的接口,至于从什么地方读出来和保存到那里去都被隐藏在函数参数的背后了,这样子,任何类型只要实现了serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方,也可以用管道来传输系统的其他程序中,这样子极大地简化了类的设计,只要设计一个保存一个读取功能就能解决上面说的所有问题
- java的对象序列化能让你将一个实现了serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,你就能把这些byte数据恢复出来,并据此从新构建那个对象了
- 工作流当中流程变量的几种数据类型:string、integer、short、long、double、boolean、date、binary、serializable,这就是为什么要将javabean实现序列化的原因,因为你将对象设置到流程变量中必须要实现序列化,否则会在设置流程变量的时候报错找不到该类型
- java对象序列化机制就是把内存中的java对象转成二进制流,java对象序列化后很方便的存储或者在网络中传输
- java的序列化机制是通过运行时判断类的序列化ID(serialVersionUID)来判断版本的一致性
- 在反序列时,java虚拟机会通过二进制流中的serialVarsionUID与本地的相对应的实体类进行比较,如果相同就认为是一致的,可以反序列化,正确获得信息,否则抛出序列化版本不一致的异常
所以涉及到数据传输或者存储的类,严格意义上来说都要加上序列化ID,这也是一种良好的编程习惯