1.问题一:java.io.NotSerializableException:com.qf.objectstream_03.Person:这个类未实现序列化接口
解决方法
Serializable接口,实现了这个接口,表示这个类可被ObjectOutputStream写入带流中
2.问题二:直接修改了Person类的内容,然后直接进行反序列化:报错
java.io.InvalidClassException:com.qf.objectstream_03.Person;
local class incompatible: stream classdesc serialVersionUID =6724044596808576364,
local class serialVersionUID =1520880495741605311
因为一旦进行序列化,类中包含的编码(类的签名信息:类中相关的成员)---会产生一个serialVersionUID,序列化版本ID
当直接修改了某个类的成员,不能直接进行反序列化,因为内存中的serialVersionUID不一致!
解决方法:添加一个固定的序列化版本Id值:常量
4.代码实现
publicclassObjectStreamDemo{publicstaticvoidmain(String[] args)throwsException{// myWrite() ;myRead();}//反序列化 读privatestaticvoidmyRead()throwsException{//创建一个反序列化流对象// public ObjectInputStream(InputStream in) throws IOExceptionObjectInputStream ois =newObjectInputStream(newFileInputStream("oos.txt"));//将这个文件的存储的Java对象的原始数据 "流数据"---->还原成对象//public final Object readObject()throws IOException,ClassNotFoundExceptionObject o = ois.readObject();System.out.println(o);}//序列化 写privatestaticvoidmyWrite()throwsException{//创建一个序列化流对象// public ObjectOutputStream(OutputStream out) throws IOException: 创建序列化流对象ObjectOutputStream oos =newObjectOutputStream(newFileOutputStream("oos.txt"));// public final void writeObject(Object obj) throws IOException//创建一个Person类对象Person p =newPerson("高圆圆",42);
oos.writeObject(p);//释放资源
oos.close();}}publicclassPersonimplementsSerializable{//setting--->Editor-->inspections--->搜索serialVersionUID,勾上//在类上--->alt+enter--->Add 添加一个固定的序列化版本Id值:常量privatestaticfinallong serialVersionUID =7408836797431347489L;String name ;privatetransientint age ;//如果想让某个类的成员不参与序列化,关键字transientpublicPerson(){}publicPerson(String name,int age){this.name = name;this.age = age;}@OverridepublicStringtoString(){return"Person{"+"name='"+ name +'\''+", age="+ age +'}';}}