序列化与反序列化

序列化与反序列化

序列化
Serializable 接口
想要通过对象流序列化对象,被序列化的对象必须实现 Serializable 接口

public class MyObject implements Serializable { … }
该接口是一个标记性接口,里面没有任何抽象方法
只要一个类实现 Serializable 接口,就表示这个类是可被序列化的
transient 关键字
被 transient 关键字修饰的变量不会被序列化

public class MyObject implements Serializable {
private transient String password;
}
反序列化
当 Serialization 运行时检测到某个类具有以下问题之一时,抛出异常 InvalidClassException

该类的序列版本号与从流中读取的类描述符的版本号不匹配
该类包含未知数据类型
该类没有可访问的无参数构造方法
序列版本号
seriaVersionUID,即序列版本号。当类中没有定义该变量时,JVM 会根据类中的信息 (包括变量和方法) 自动计算出一个序列号。如果类中的信息被修改了,那么JVM会重新计算出一个序列号。
为了以后维护代码,需要序列化的 JavaBean 类最好手动定义一个 seriaVersionUID 。

public class MyObject implements Serializable {
private static final long seriaVersionUID = 1L;
// 序列版本号的值可以随意指定,只要在 long 取值范围内就行。
}
ObjectOutputStream 与 ObjectInputStream
ObjectOutputStream

构造方法:
ObjectOutputStream(OutputStream out) //创建写入指定 OutputStream 的 ObjectOutputStream

其他方法:
void writeObject(Object obj) //将指定的对象写入 ObjectOutputStream
ObjectInputStream

构造方法:
ObjectInputStream(InputStream in) //创建写入指定 OutputStream 的 ObjectOutputStream

其他方法:
Object readObject() //从 ObjectInputStream 读取对象
ObjectInputStream 特殊的文件结束方式
ObjectInputStream 与其他输入流不同;它在读取到文件末尾时不会返回任何标识符,而是报出 EOFException 异常。因此反序列化多个对象就有以下两种思路。

读取时手动捕获 EOFException 异常
while(true){
try(){
Object o = ois.readObject();
} catch (EOFException e) {
break;
}
}
ois.close();
存储时,直接将要序列化的对象放在一个容器中;读取时就只需读取一个容器对象。
//序列化
ArrayList list = new ArrayList<>();
list.add(o1)
// … 添加要序列化的对象到 list 中。

oos.writeObject(list);

oos.close();

//反序列化
ArrayList list2 = (ArrayList) ois.readObject();
ois.close()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值