对象输入输出流涉及到的序列化、反序列化问题

一、重要理解 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值