对象输入输出流--序列化

一、重要理解---对象输出输入流

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. 兼容问题的出现:序列化时的类型是原类型,反序列化前,
我们可能对此类进行了修改(比如,修改了某一属性的名称,
或添加或删除了某一新属性),当在反序列化时,如果发现版本号不同
反序列化会失败,如果版本号相同,反序列化会成功。
  大笑
  
  
  

猜你喜欢

转载自blog.csdn.net/xiaozelulu/article/details/80048579