对象流
有的时候我们可能需要将内存中的对象持久化到硬盘上,或者将硬盘中的对象信息读到内存、中,这个时候我们需要使用对象输入输出流。
序列化:是对象转换成一个字节序列的过程,是一个写操作(ObjectInputStream)
反序列化:一个字节序列转换成对象的过程,是一个读操作(ObjectOutputStream)
ObjectOutputStream
构造器:
ObjectOutputStream(OutputStream out) --------- 创建一个指定字节输出流的对象输出流对象。
常用方法:除了提供一些基本数据类型的写方法外,还提供了
void writeObject(Object obj)-------将内存中的对象持久化到硬盘上
ObjectInputStream
构造器:
ObjectInputStream(InputStream out)-----------创建一个指定字节输入流的对象输入流对象。
常用方法:除了提供一些基本数据类型的写方法外,还提供了
void readObject(Object obj)----从硬盘上读取一个字节序列,转换成对象
Serializable:序列化接口
如果想将对象序列化,那么对象的类型必须实现此接口。此接口内什么都没有,只是一个序列化标识。
String中提供了serialVersionUID常量:
作用:每个能序列化的对象,在被序列化时,系统会默认给此对象的类提供序列化版本号。
不同的平台默认提供的序列化版本号多数情况下不会相同。因此,当我们反序列化
时,如果硬盘里存储的对象的版本号与当前设计的类型的版本号不一致,会出现运行
时异常:java.io.InvalidClassException
这种情况称为不兼容问题
如果我们想解决不兼容问题。我们应该手动提供版本号。尽可能的相同,这样来解决
不兼容问题。
另外一种情况:
序列化过后,可能会修改类型,如果使用默认提供的版本号,在反序列化
时,会出现异常;如果手动提供版本号,不出现异常,多出来的成员变量
以类型的默认值的形式,赋值给反序列化的对象。
transient:成员变量的一个修饰词,可以理解为瘦身。
有的时候在序列化对象时,我们不需要将对象的某些成员变量的值持久化到硬盘上,(因为不重要),此时,我们可以在这些成员变量前添加修饰词transient。