A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秋天中の夏季 中级黑马   /  2015-8-23 00:03  /  167 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

     如果对象中的数据,反复使用,或者传递别人使用

    将对象中的数据,以二进制流的形式写入到文件中,保存
    对象写到文件中保存,对象的序列化
   

对象的反序列化
    将二进制形式保存的文件,从流中读取出来,还原回对象
   

java.io.ObjectOutputStream 对象输出字节流,写对象,做序列化
java.io.ObjectInputStream 对象输入字节流,读取对象,做反序列化


ObjectOutputStream构造方法
   ObjectOutputStream(OutputStream out)传递字节输出流
       字节输出流封装文件:  FileOutputStream("XXX")
      
    void writeObject(Object o) 写对象的方法
   

  ObjectInputStream构造方法
    ObjectInputStream(InputStream in)传递字节输入流
      字节输入流封装文件:  FileInputStream("XXX")
     Object readObject()读取对象方法
     
序列化一个对象,这个类必须类通过实现 java.io.Serializable 接口以启用其序列化功能

反序列化的时候,没有对应的class文件,抛出类找不到异常ClassNotFoundException

对象序列化,static修改,成员属于类,不属于对象,静态不能序列化


Serializable接口,没有任何抽象方法的接口
标记型接口,给类做一个标记,JVM看到标记后,可以将类对象进行序列化
比喻 : 猪肉(戳子,蓝色,检验合格)

没有抽象方法抽象类


Exception in thread "main" java.io.InvalidClassException:
  cn.itcast.iostream.Person; local class incompatible:
   stream classdesc serialVersionUID = -5075003414356443568,
    local class serialVersionUID = 4022578570691496470
   


private int age;
进行对象的序列化,成功反序列化

源代码修改成 public int age;
没有对象的序列化,直接反序列化,失败,出现异常

private int age;
保存,对源代码编译成class文件,记录这个类的序列号,根据类成员修饰计算的  20
对象序列化,写文件出来,文件中保存这个序列号 20


对源代码修改 public int age
保存,源代码编译成class文件,修饰符变化,序列化从新被计算,保存到class文件中 50
没有序列化,直接反序列化,读取序列化文件,文件中保存的是原来的号码20, class文件变成50

即使修改了修饰符,不做序列化,可以直接反序列成功,保证序列号是一样的

修改了源代码,序列化肯定从新生成,即使修改了源代码,序列化不能变

对于一个Person类,序列化固定不变,无论怎么修改源代码,序列号不变

自己定义序列号

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马