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

被折叠的 条评论
为什么被折叠?



