简而言之:序列化,就是为了在不一样时间或不一样平台的JVM之间共享实例对象。即序列化出于两个缘由:①、用于持久化到磁盘上;②、用于做为数据流在网络上传输。java

所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去,都被隐藏在函数参数的背后了。这样,任何类型只要实现了Serializable接口,就能够被保存到文件中,或者做为数据流经过网络发送到别的地方。也能够用管道来传输到系统的其余程序中。这样极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说的全部问题。编程

java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样往后要用这个对象时候,你就能把这些byte数据恢复出来,并据此从新构建那个对象了。网络

工做流当中流程变量的几种数据类型:string integer short long double boolean date binary serializable,这就是为何要将JAVA bean实现序列化的缘由,由于你将对象设置到流程变量中必需要实现序列化,不然会在设置流程变量的时候报错找不到该类型。函数

java对象序列化机制就是把内存中的Java对象(User之类的JavaBean)转换成二进制流。java对象序列化后能够很方便的存储或者在网络中传输。Java的序列化机制是经过运行时判断类的序列化ID(serialVersionUID)来断定版本的一致性。在反序列化时,java虚拟机会经过二进制流中的serialVersionUID与本地的对应的实体类进行比较,若是相同就认为是一致的,能够进行反序列化,正确得到信息,不然抛出序列化版本不一致的异常。因此涉及到数据传输或者存储的类,严格意义上来讲都要加上序列化ID,这也是一种良好的编程习惯。设计

注:对象

一、在序列化对象时,不只会序列化当前对象自己,还会对该对象引用的其它对象也进行序列化,如此引用传递序列化。若是一个对象包含的成员变量是容器类等并深层引用,那么序列化过程开销也较大。接口

二、当字段被声明为 transient 后,默认序列化机制就会忽略该字段。(还有方法就是自定义writeObject方法,见下代码示例)内存

三、在单例类中添加一个readResolve()方法(直接返回单例对象),以保证在序列化过程仍保持单例特性。虚拟机