一、序列化和反序列化的概念  
把对象转换为字节序列的过程称为对象的序列化。
   把字节序列恢复为对象的过程称为对象的反序列化。
  
  对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。
  
  在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

二、JDK类库中的序列化API 
 
1、java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

2、java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

3、只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

4、对象序列化包括如下步骤:
  1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
  2) 通过对象输出流的writeObject()方法写对象。

5、对象反序列化的步骤如下:
  1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
  2) 通过对象输入流的readObject()方法读取对象。
 
6、对象序列化和反序列范例:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
/*** * @author lmb*将map键值对序列化输出到磁盘上,再读入,然后再将其以键值对的形式打印到控制台*/
public class ObjectOutput {public static void main(String[] args) throws Exception{//构造MAP对象Map m=new HashMap();m.put("cat", "猫");m.put("dog", "狗");m.put("pig", "猪");m.put("sheep", "羊");//构造输出流(序列化)ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("F:/私人物品刘梦冰/学习资料/exercise/object.obj"));oos.writeObject(m);//将对象序列化输出oos.flush();oos.close();//构造输入流(反序列化)ObjectInputStream ois=new ObjectInputStream(new FileInputStream("F:/私人物品刘梦冰/学习资料/exercise/object.obj"));for (;;) {Object object=ois.readObject();if (object==null)   break;System.out.println(object);}ois.close();}
}

运行结果:


三、serialVersionUID的作用

  s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ ​字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。
  

四、serialVersionUID的取值

  serialVersionUID的取值是Java运行时环境根据类的内部细节自动生成的。如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化。
  类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的 serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。

  显式地定义serialVersionUID有两种用途:
    1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
    2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。

I/O流(三)—对象的序列化和反序列化相关推荐

  1. js笔记(三)ES5、ES5新增的数组的方法、字符串的方法、字符编码、对象的序列化和反序列化、bind

    数组方法.字符串方法总结 大目录 小目录 一.ES5严格模式 1. 严格模式: 2. 严格模式的行为变更: 二.ES5新增的数组的方法 1. 判断是否为数组:Array.isArray(): 2. 判 ...

  2. Java对象的序列化和反序列化

    [感谢]孤傲苍狼的 Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行 ...

  3. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如文件或是内存缓冲区等.在网络传输过程中,可以是字节或是 ...

  4. Java 对象的序列化和反序列化

    当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再 ...

  5. 对象的序列化与反序列化---IO学习笔记(四)

    对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流,反序列化流 序列化流(ObjectOutputStream) ...

  6. java对象的序列化和反序列化详细解释

    java对象的序列化和反序列化是什么意思 1.序列化是干啥用的? 序列化的原本意图是希望对一个Java对象作一下"变换",变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结 ...

  7. 一文带你全面了解java对象的序列化和反序列化

    本文分享自华为云社区<java中什么是序列化和反序列化?>,原文作者:dayu_dls . 这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍 ...

  8. 反序列化对象列表发生异常_面试官:你知道Java对象的序列化与反序列化背后的原理吗?...

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

  9. 从零开始学前端:json对象,对象的序列化和反序列化 --- 今天你学习了吗?(JS:Day15)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(JS) 复习:从零开始学前端:字符串.数组的方法 - 今天你学习了吗?(JS:Day12/13/14) 文章目录 从零开始学前端:程序猿小 ...

  10. java中对象的序列化和反序列化

    [对象的序列化和反序列化 ] 1.定义: 序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才 ...

最新文章

  1. 小功能 - 收藏集 - 掘金
  2. Java BigDecimal常用方法
  3. wpf slider 控件模板
  4. Python Django 图片上传及显示代码示例
  5. robomaster视觉组代码中的一些函数
  6. Android-完美解决在Activity中触摸返回键onBackPressed不能触发问题
  7. php负责传递数据,php传递数据的方法有哪些
  8. 计算机基础知识第3版答案,计算机基础知识试题库及答案(3)
  9. 【转】Dynamics版本历史演进及Dynamics 365重要功能介绍
  10. 奥松机器人PHP,Arduino四位七段数码管 LED数码管 4位共阳数码管 显示屏模块
  11. 关于如何调用Datalist里面的Datalist
  12. Python 爬虫 (三) - Socket 网络编程
  13. xp系统无法从补丁服务器获取补丁,怎么获取到xp系统的微软补丁_微软补丁获取方法 - 驱动管家...
  14. asp.net通用Web2.0仿淘宝脚本验证组件
  15. 白帽子讲Web安全(第 1 章 我的安全世界观)
  16. UE4 虚幻引擎上传或者复制项目,打包压缩时,需要保留的文件目录
  17. python1到100奇数和_python计算1~100的和,1~100奇数的和,1~100偶数的和,一条代码求1~100的和...
  18. 6篇论文入选NIPS 2018,这位中国小哥的开挂人生
  19. KDD 2011 最佳工业论文中机器学习的实践方法-翻译
  20. 开源一对一源码,一对一直播系统如何接入码支付

热门文章

  1. 在Android Studio中打开DDMS
  2. android 监听网络状态
  3. WebKit DOM Event (一)
  4. 04-程序计数器(PC计数器)
  5. InnoDB中一棵B+树能存多少行数据
  6. Jetpack:使用 ActivityResult 处理 Activity 之间的数据通信
  7. 【网络流24题】魔术球问题(最大流)
  8. java去除字符串的空格,换行符,水平制表符,回车
  9. 如何应对云爆发架构?四种方法替你解忧
  10. PHOTOSHOP中3D下拉菜单为灰色如何设置