序列化与反序列化

1 概述

序列化是指将对象的状态信息转换为可以存储或传输形式的过程,在序列化期间,对象将其当前状态写入到临时或持久性存储区,以后可以通过从存储区中读取或者反序列化对象的状态,重新创建对象。

序列化:利用ObjectOutputStream,把对象的信息,按照固定的构式转成一串字节值输出并持久保存到磁盘

反序列化:利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象

2 特点/应用场景

1.需要序列化的文件必须实现Serializable接口,用来启用序列化功能

2.不需要序列化的数据可以修饰成static,原因:static资源属于类资源,不随着对象被序列化输出

3.每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个

4.在反序列化时,如果和序列化的版本号不一致,无法完成反序列化

5.常用与服务器之间的数据传输,序列化成文件,反序列读取数据

6.常使用套接字流在主机之间传递对象

 7.不需要序列化的数据也可以被修饰成transient(临时的),只在程序运行期间在内存中存在,不会被序列化持久保持  

3 涉及到的流对象

序列化:ObjectOutputStream

ObjectOutputStream将 Java对象的基本数据类型写入OutputStream,通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

反序列化:ObjectInputStream

ObjectInputStream对以前使用ObjectputStream写入的基本数据和对象进行反序列化重构对象 

4 为什么反序列化版本号需要与序列化版本号一致

我们在反序列化时,JVM会拿着反序列化流中的serialVersionUID与序列化时相应的实体类中的serialVersionUID来比较,如果不一致,就无法正常反序列化,出现序列化版本不一致的异常InvalidClassException。

而且我们在定义需要序列化的实体类时,如果没有手动添加UID,

Java序列化机制会根据编译的class自动生成一个,那么只有同一次编译生成的class才是一个的UID。

如果我们手动添加了UID,只要这个值不修改,就可以不论编译次数,进行序列化和反序列化操作。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员黑马二代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值