IO之序列化流与反序列化流

首先是运行图

 

 

 对象序列化流ObjectOutputStream

ObjectOutputStream Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。

通过在流中使用文件可以实现对象的持久存储。

首先创建一个person类

表明空参构造,有参构造 tostring

 

 

 然后创建demo01

 

 

 

 成功后演示

 

 

 

 

因为是写进系统的数据 所以是乱码

 

 

 对象反序列化流ObjectInputStream

 

 

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。支持 java.io.Serializable接口的对象才能从流读取。

 

 

 

 成功运行演示

 

 

序列化接口

 

当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常。

 

 

 

同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException。发生这个异常的原因如下:

 

该类的序列版本号与从流中读取的类描述符的版本号不匹配

 

该类包含未知数据类型

 

该类没有可访问的无参数构造方法

 

Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

 

代码演示:

 

 

 瞬态关键字transient

当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。只要被transient修饰了,序列化时这个属性就不会序列化了。

同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

代码演示:

 

 

 

 

遍历多个对象:

写入多个值:

 

 

 读取所有值:

 

posted @ 2020-02-06 12:36  邢昊天  阅读(205)  评论(0)    收藏  举报