一、重要理解---对象输出输入流
1.啥是序列化??序列化:就是将数据转成一串字节序列---持久化
反序列化:就是将一串字节序列转成相应的数据
2.对象输出输入流:(也是以字节流为参数)
输出流:将对象序列化-- ObjectOutputStream
输入流:将对象反序列化-- ObjectInputStream
3.构造器:---以字节流为参数
ObjectOutputStream(new FileOutputStream("object.txt"));
ObjectInputStream(new FileOInputStream("object.txt"));
4.例子
1)序列化:
* 创建一个Emp对象 ,Emp 继承 Serializable
Emp emp = new Emp(1001,"张三","男",2000);
ObjectOutputStream oos =
new ObjectOutputStream(
new FileOutputStream("object.txt"));
oos.writeObject(emp);//序列化时已经忽略了transient修饰的属性
oos.close();
2) * 反序列化
ObjectInputStream ois =
new ObjectInputStream(
new FileInputStream("object.txt"));
Emp e = (Emp)ois.readObject();
System.out.println(e);
*比较序列化前和反序列化回来的对象是否是同一个
System.out.println(emp==e);
3)当然也可以 为此类Emp提供版本号,提供后,不能修改了。
声明属性时:
private static final long serialVersionUID =12313123L;
*鼠标放在类名上就会自动生成版本号。
5.注意1
1:被序列化的对象的类型必须实现Serializable接口;
2:提供序列化版本号的属性;
(以防类型被改变后不能反序列的问题出现-兼容性问题)
3. 序列化的修饰词:transient
作用是:对象的某些属性没必要持久化时,可以在类型的
这些属性前添加此修饰词
6.注意2
1)如果想将对象写出到硬盘上的文件,那么此对象的类型
必须要实现序列化接口:Serializable。
此接口内 是空的,只起到一个标志的作用。
2)在序列化时,有时候对象的某些属性没那么重要,可以不用
持久化到硬盘上-就是在控制台输出,(达到了给对象瘦身的效果),
只需要在相应的属性前添加修饰词transient。
3)在序列化对象时,需要给类型提供serialVersionUID这个属性。
也就是为每一个类型提供版本号属性。这样就可以处理反序列化时的兼容问题。
7. 兼容问题的出现:序列化时的类型是原类型,反序列化前,
我们可能对此类进行了修改(比如,修改了某一属性的名称,
或添加或删除了某一新属性),当在反序列化时,如果发现版本号不同
反序列化会失败,如果版本号相同,反序列化会成功。