这次真把序列化与反序列化给学会了

序列化与反序列化

在Java的对象流中存在序列化与反序列化,那什么是序列化和反序列化呢?
在这里插入图片描述
现在有一个完整的JavaBean对象Student,代码如下:
在这里插入图片描述

我们准备通过对象输出流写入文件中一个Student对象
在这里插入图片描述

Serializable接口

我们发现会出现一个java.io.NotSerializableException异常,百度过之后发现是没有实现序列化接口异常,也就是说我们传送对象的Student类没有实现Serializable接口,这也就是当我们使用对象流传送文件是,传送对象的类都需要实现Serializable接口,那么Serializable有什么作用?
在这里插入图片描述
通过源码也可以看到Serializable接口什么代码都没有,它的作用其实就是让Java虚拟机知道他继承了序列化接口,是一个序列化的类,以便给它生成一个唯一的序列化号来辨识

Java中有两种接口
一种是普通的接口
例如:Runnable接口,Closeable接口,Flushable接口等
一种是标志性的接口,里面什么都没有,作用:给JVM看的,JVM看到会进行相应的操作处理(特殊对待)
例如:Serializable接口
这个标志接口是给Java虚拟机参考的,Java虚拟机看到这个接口后,会为该类自动生成一个序列化版本号

让Student类实现Serializable接口,来看一下有什么不同
在这里插入图片描述
在这里插入图片描述
这个文件打开是乱码的,我们需要通过反序列化来打开这个文件
在这里插入图片描述

序列化多个对象

一次性序列化多个对象可以使用容器操作
在这里插入图片描述
通过容器进行反序列化
在这里插入图片描述

transient关键字

如果某种情况下,你不准备让哪一个属性参加序列化的话,可以在该属性前加上transient关键字,表示游离的,不参加序列化的
transient关键字表示一个域不是该对象序列化的一部分
例:让name属性不参加序列化
在这里插入图片描述
在这里插入图片描述

因为需求原因,需要在Student类中添加一个address属性,那它还能正常运行吗
在这里插入图片描述
在这里插入图片描述
报了一个这样的异常:Exception in thread “main” java.io.InvalidClassException: cn.cl.Test.Student; local class incompatible: stream classdesc serialVersionUID = 9103195609233908620, local class serialVersionUID = 7295193728186898313;
无效类异常,后面就是它的两次序列号

serialVersionUID序列化版本号

也就是说,当Student源代码发生改变时,JVM会重新编译这个字节码文件,重新生成.class文件,重新赋予一个序列号,两次的序列号不一致,运行时就找不到Student类,所以就会产生无效类的异常,因此,我们可以给它设置一个序列化版本号,这样JVM就不会随机给我们这个类生成了,序列化版本号一样JVM就认为是同一个类,就会正常运行了

Java语言中是靠什么机制来区分类的?
第一:首先通过类名进行比对,如果类名不一样,看到不是同一个类
第二:如果类名一样,靠序列化版本号进行区分

如果实现了Serializable接口,建议给该类手动写出序列化版本号,不建议自动生成,因为自动随机生成,后期改过代码后就会导致程序不能正常运行
手动设置:private static final long serialVersionUID = 8683452581122892189L;
在这里插入图片描述
在这里插入图片描述

总结

这是上次的IO流那块欠下的,已经很多天了哈哈,要复习很多东西,这个就给搁那了,趁这次给补上哈哈
序列化与反序列化就是对象流里面要用到的
输出数据信息是序列化,就是把数据分块,编号传输;
输入对象数据信息是反序列化,就是把一个个的数据块给拼接起来
传输对象数据的那个对象类要实现Serializable接口,这个接口是一个标示性接口,JVM会为其随机生成一个序列化版本号,==建议直接手写一个,避免后期更改代码导致程序不能正常运行,==序列化多个随想的时候可以借助于容器来实现,transient关键字表示一个域不是该对象序列化的一部分,用于不参加序列化,以上就是今天复习的内容喽,一起加油哦
明天就要靠科二了,祝我过过过哈哈
下次见喽
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值