序列化流和反序列化流

1.ObjectOutputStream对象的序列化流

java. io. objectoutputStream extends OutputStream
objectoutputStream:对象的序列化流
作用:把对象以流的方式写入到文件中保存
构造方法:
objectOutputStream(outputStream out)创建写入指定outputStream 的objectoutputstream.
参数:
Outputstream out :字节输出流
特有的成员方法:
void writeObject(object obj) 将指定的对象写入objectOutputStream.

序列化和反序列化的时候,会抛出NotSerial izableException没有序列化异常
类通过实现java. io. Serializable接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
Serializable接口也叫标记型接口
要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记
有:就可以序列化和反序列化
没有:就会抛出NotSerializableExcept ion异常


使用步骤:
1.创建bjectoutputStream对象,构造方法中传递字节输出流
2.使用objectoutputstream对象中的方法writeobject,把对象写入到文件中
3.释放资源

2.ObjectInputStream对象的反序列化流

java. io. objectInputStream extends InputStream
ObjectInputStream:对象的反序列化流
作用:把文件中保存的对象,以流的方式读取出来使用
构造方法:
objectInputstream( InputStream in)创建从指定InputStream 读取的objectInputStream.
参数:
Inputstream in:字节输入流
特有的成员方法:
object readobject() 从objectInputStream 读取对象。
使用步骤:
1.创建objectInputstream对象,构造方法中传递字节输入流
2.使用object Inputstream对象中的方法readobject读取保存对象的文件
3.释放资源
4.使用读取出来的对象(打印)
readobject方法声明抛出了ClassNotFoundException(class文件找不到异常)
当不存在对象的closs文件时抛出此异常
反序列化的前提:
1.类必须实现Serializable
2.必须存在类对应的class文件

static关键字:静态关键字
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
被static修饰的成员变量不能被序列化的,序列化的都是对象
private static int age;
oos . write0bject(new Person(”小美女”, 18)); 
object= ois. readobject();
Person{name=‘小美女', age=0}
transient关键字:瞬态关键字
被transient修饰成员变量,不能被序列化
private transient int age;
oos. writeobject(new Person(”小美女", 18));
object= ois.readobject();
Person{name=‘小美女',age=0}|

 

**另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化
操作也会失败,抛出一一个‘| IqvalidClassException异常。
*发生这个异常的原因如下:
●该类的序列版本号与从流中读取的类描述符的版本号不匹配
●该类包含末知数据类型
●该类没有可访问的无参数构造方法
Serializable接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序
列化的对象和对应类是否版本匹配。
 

序列化运行时使用一个称为seri alVersionUID的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和捌收
者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的serialVersi onUID与对应的发送者的类的版本号不同,则反序列化将会
导致InvalidClassException。 可序列化类可以通过声明名为"serialVersionUID" 的字段(该字段必须是静态(static)、 最终(final) 的long型字
段)显式声明其自己的seri alVersi onUID:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L: 


3.序列化集合和反序列化集合

练习:序列化集合
当我们想在文件中保存多个对象的时候
可以把多个对象存储到- -个集合中
对集合进序列化和反序列化
分析:
1.定义一个存储Person对象的ArrayList集合
2.往ArrayList集合中存储Person对象
3.创建一个序列化流objectoutputstream对象
4.使用objectoutputStream对象中的方法writeObject,对集合进行序列化
5.创建一个反序列化objectInputstream对象
6.使用objectInputstream对象中的方法read0bject读取文件中保存的集合
7.把object类型的集合转换为ArrayList类型
8.遍历ArrayList集合
9.释放资源

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值