1、什么是序列化与反序列化?

序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制串的过程

反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

2、为什么要做序列化?

①、在分布式系统中,此时需要把对象在网络上传输,就得把对象数据转换为二进制形式,需要共享的数据的 JavaBean 对象,都得做序列化。

②、服务器钝化:如果服务器发现某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(Java对象转换为二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成 Java 对象。这样能节省服务器内存。

3、Java 怎么进行序列化?

①、需要做序列化的对象的类,必须实现序列化接口:Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法),Java 中大多数类都实现了该接口,比如:String,Integer

②、底层会判断,如果当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断。

③、在 Java 中使用对象流来完成序列化和反序列化

ObjectOutputStream:通过 writeObject()方法做序列化操作

ObjectInputStream:通过 readObject() 方法做反序列化操作

第一步:创建一个 JavaBean 对象

public class Person implements Serializable{

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

}

第二步:使用 ObjectOutputStream 对象实现序列化

//在根目录下新建一个 io 的文件夹

OutputStream op = new FileOutputStream("io"+File.separator+"a.txt");

ObjectOutputStream ops = new ObjectOutputStream(op);

ops.writeObject(new Person("vae",1));

ops.close();

我们打开 a.txt 文件,发现里面的内容乱码,注意这不需要我们来看懂,这是二进制文件,计算机能读懂就行了。

错误一:如果新建的 Person 对象没有实现 Serializable 接口,那么上面的操作会报错:

第三步:使用ObjectInputStream 对象实现反序列化

反序列化的对象必须要提供该对象的字节码文件.class

InputStream in = new FileInputStream("io"+File.separator+"a.txt");

ObjectInputStream os = new ObjectInputStream(in);

byte[] buffer = new byte[10];

int len = -1;

Person p = (Person) os.readObject();

System.out.println(p); //Person [name=vae, age=1]

os.close();

问题1:如果某些数据不需要做序列化,比如密码,比如上面的年龄?

解决办法:在字段面前加上 transient

private String name;//需要序列化

transient private int age;//不需要序列化

那么我们在反序列化的时候,打印出来的就是Person [name=vae, age=0],整型数据默认值为 0

问题2:序列化版本问题,在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错:

解决办法:在 JavaBean 对象中增加一个 serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了

private static final long serialVersionUID = 8656128222714547171L;

反序列化 对象 java_Java IO详解(六)------序列化与反序列化(对象流)相关推荐

  1. php 打印对象详细信息,php打印显示数组与对象的函数详解

    php打印显示数组与对象的函数详解 发布于 2014-11-17 18:55:49 | 699 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext P ...

  2. JavaScript字符串对象的方法详解

    JavaScript字符串对象的方法详解 前面的博客我们说到了字符串对象的创建,属性及字符串的拼接.现在来详细讲一下字符串的方法. 1.ES6之前的方法 // js字符串的方法var str=&quo ...

  3. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  4. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  5. 详解 Python 源码之对象机制

    在Python中,对象就是在堆上申请的结构体,对象不能是被静态初始化的,并且也不能是在栈空间上生存的.唯一的例外就是类型对象(type object),Python中所有的类型对象都是被静态初始化的. ...

  6. 详解Scala函数也是对象的特性

    详解Scala函数也是对象的特性

  7. python 元类 type_Python 使用元类type创建类对象常见应用详解

    本文实例讲述了Python 使用元类type创建类对象.分享给大家供大家参考,具体如下: type("123") 可以查看变量的类型;同时 type("类名", ...

  8. 网络IO和磁盘IO详解

    网络IO和磁盘IO详解 1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓 ...

  9. 浏览器对象存储数据详解

    浏览器对象存储数据详解 前言 随着需求的发展,浏览器的功能正变的越来越强大,在本地存储数据可以极大的方便人们进行各种操作,如localStroage/sessionStroage等,下面我就记录在项目 ...

最新文章

  1. 滚动条的一些常见问题
  2. php 判断上传的是否是图片,php图片上传检测是否为真实图片格式
  3. AOP、注解实现日志收集
  4. 增加数据_咱晋城人口又增加了?最新数据来了
  5. 织梦首页去掉inde.html,dedecms 首页删除index.html路径的方法
  6. 各大网站猪年新春应景LOGO秀
  7. 如何导进开源库StickyListHeaders
  8. 6-1 二叉搜索树的操作集 (30 分)
  9. arcmap发布三维地图_如何使用高程DEM建立三维地图模型(Arcgis ArcScene)
  10. Python-re中search()函数的用法-----查找ip(超详细)
  11. Microsoft Dynamics 365咨询服务研究报告-Microsoft Dynamics 365咨询服务生产基地、总部、竞争对手及市场地位
  12. 请问dede怎么样把会员信息调用到首页,调用会员头像和名字
  13. 易知微当选中国互联网协会数字孪生技术应用工作委员会成员单位
  14. Docker基础命令学习
  15. 3d Max人物动画学习笔记(二)蒙皮
  16. mail.yahoo.com.cn:yahoo邮箱用outlook无法发信问题的解决办法
  17. 程序员大阳--所有教程、项目、源码导航
  18. python处理字符串(SQL语句批量新增)
  19. 小米4S_2015911_官方线刷包_救砖包_解账户锁
  20. 解决error:torch has an invalid wheel,.dist -info directory not fount

热门文章

  1. 智能传感器可以实现的10个强大物联网应用
  2. HTML入门基础教程
  3. 平面几何----梅氏定理逆定理的证明
  4. gm11模型 MATLAB源代码,灰色预测模型 GM(1,1)- 级比检测不通过 - 平移变换常数c的确定(内含代码)...
  5. python二进制数连接_python二进制处理详述(转)
  6. 科学数字_沉默的数字生命:融合艺术、哲学与科学的3D数字雕塑
  7. gcn 图卷积神经网络_谱域图卷积模型---SCNN,ChebNet,GCN
  8. wordpress自适应表格_wordpress响应式移动端完美自适应宽屏主题
  9. vue-cli 打包出来的文件缺少_关于vue-cli打包或者上线后文件各种路径或者找不到的问题解决方案...
  10. php开发工程师学费,青岛PHPWEB开发工程师班