如果对象中的数据,反复使用,或者传递别人使用
将对象中的数据,以二进制流的形式写入到文件中,保存
对象写到文件中保存,对象的序列化
对象的反序列化
将二进制形式保存的文件,从流中读取出来,还原回对象
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类,序列化固定不变,无论怎么修改源代码,序列号不变
自己定义序列号
|
|