Serializable序列化流示例详解

本文用Java代码详细分析了序列化与反序列化。介绍了序列化流的使用步骤,包括创建流、使用流和关流,指出对象需实现Serializable接口才能被序列化。还测试了反序列化,强调一次序列化对应一次反序列化,若不对应会报错,并给出解决办法。

说到Serializable,一查资料就是说作用即序列化,这里用代码的来详细分析一下

测试序列化流

(序列化与反序列化的作用就是对象的保存和传输)

首先,知道其作用是起将对象序列化,那么就来创建一个对象,设置属性,生成get/set方法及无参/全参构造,toString方法;

然后创建一个测试类,创建main方法,调method1方法,等下里面写代码来测试序列化方法 

下面 完善序列化测试方法method1代码,序列化流的使用步骤基本就三步,

即  1创建流   2使用流   3关流

这里到method1方法里面创建流,但首先因为要操作流易发生异常,所以需要先创建一个try-catch-finally结构

 先在try-catch-finally结构前面声明一个只在本方法内生效的局部变量:ObjectOutputStream(对象输出流),并初始化

 创建用于序列化的流对象ObjectOutputStream,但提示需要传参(OutputStream)

, 

但OutputStream(字节输出流)是一个抽象父级,不能实例化,所以传它的子类FileOutputStream, 而FileOutputStream创建可以直接传路径或是File对象,这里以传路径举例

创建序列化测试对象

使用序列化流 调writeObject方法 将对象序列化输出,并捕捉异常,最后关流( 也要try-catch)

 运行方法发现报错,都指向这个对象类

 因为如果一个类的对象想要被序列化输出,那么就必须要实现可序列化接口(Serializable),否则就会报错 NotSerializableException;Serializable接口点进去是一个空接口,里面一个方法也没有,作用是打上标记,标记这个类可以被序列化

给测试对象实现Serializable接口之后,再去运行,就可以成功了,并且指定路径下的文件中有了数据(这里是乱码也没事,因为这些数据是持久化在本地磁盘的,不是给用户看的,如果用户能看懂,也就不需要后面的反序列化了)

接下来测试反序列化

同理创建流,写try-catch-finally结构 创建对象输入流,传文件输出流(路径即刚刚创建的文件路径),并在最后关流

 这里用readObject方法来读取恢复对象,生成一下返回参数,发现是Object,这里是多态的概念

 

直接输出Object即可

结果展示

这里需要一次序列化对应一次反序列化,若没有对应上, 就会报错,因为每一次序列化都会生成一个用户看不见的UID标识,在反序列化的时候来分辨这个对象是不是发生了变化

若想解决这个问题,有两个办法:

        第一就是 需要一次序列化对应一次反序列化

        第二种 就是将UID写死 这样无论怎样修改对象,其UID都不会改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值