对象的序列化流ObjectOutputStream和反序列化流ObjectInputStream

1.ObjectOutputStream类

 ObjectOutputStream extends OutputStream

对象的序列化流:把对象以流的方式写入到文件中保存。

构造方法:

ObjectOutputStream(OutputStream out)
//创建写入指定OutputStream的ObjectOutputStream序列化流

写入方法:

void writeObject(Object obj)
//将指定对象写入ObjectOutputStream

2.Serializable接口

标记型接口:要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记。当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记。有: 就可以序列化和反序列化;没有: 就会抛出NotSerializableException异常。
一个类的序列化是由类实现java.io.serializable接口启用。如果类没有实现这个接口,就无法使其序列化或反序列化。所有类型的序列化类本身是可序列化的。序列化接口没有任何方法或字段只能识别可序列化的语义。

3.ObjectInputStream类

ObjectInputStream extends InputStream

对象的反序列化流:把文件中保存的对象,以流的方式读取出来使用。

构造方法:

ObjectInputStream(InputStream in)
//创建从指定InputStream 读取的 ObjectInputStream

读取方法:

Object readObject() 
//从 ObjectInputStream 读取对象

readObject方法声明抛出了ClassNotFoundException(class文件找不到异常),当不存在对象的class文件时抛出此异常。
反序列化的前提:
(1)类必须实现Serializable接口
(2)必须存在类对应的class文件

4.transient关键字

static关键字: 静态关键字。静态优先于非静态加载到内存中(静态优先于对象进入到内存中);被static修饰的成员变量不能被序列化,序列化的都是对象。

transient关键字: 瞬态关键字。被transient修饰的成员变量,不能被序列化。

5.InvalidClassException序列化冲突异常

问题:当修改类的定义时,都会给class文件生成一个新的序列号(serialVersionUID),则可能出现序列化异常冲突。

解决方案:手动给类添加一个序列号。可序列化类可通过声明名为”serialVersionUID"的字段(static final long 型的字段)显式声明其自己的serialVersionUID:static final long serialVersionUID = 42L;(常量 不能改变)

序列化与反序列化过程:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值