对象序列化中java.io.InvalidClassException的解决方法

来源:互联网 发布:北京seo公司哪家好 编辑:程序博客网 时间:2024/06/05 05:24

序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。    对象 -- 流数据(ObjectOutputStream)

反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)

序列化流和反序列化流不同于字节流 字符流 内存字节流,这些都是把字符串写入/读取文件,序列化流和反序列化流可以将对象写入/读取文本文件中.

但是我们要注意的是,写入和读取的文件要实现Serializable这个接口,当然这个接口是没有任何方法的,直接implements就好,类似于这种没有任何方法的接口被称为标记接口.

可是当我们对原有的对象中的数据改变了之后,直接读取(不写入,在实际开发中不能每改一次就写入一次),就会报错:

 

 

java.io.InvalidClassException: DemoPerson; local class incompatible: stream classdesc serialVersionUID = -2071565876962058344,  local class serialVersionUID = -8345153069362641443

这是因为对象类实现Serializable就会有一个id值,当改变对象中的数据时,这个id值会发生改变,但是文本文件中的写入和读取的id还是以前的id值,造成id值不匹配,就会报错,解决办法:对象类中会报一个黄色的警告,点击这个警告按照编译器实现就行.

附代码:

Person

复制代码
 1 public class Person implements Serializable { 2     private static final long serialVersionUID = -2071565876962058344L; 3  4     private String name; 5  6     // private int age; 7  8     private transient int age; 9 10     // int age;11 12     public Person() {13         super();14     }15 16     public Person(String name, int age) {17         super();18         this.name = name;19         this.age = age;20     }21 22     public String getName() {23         return name;24     }25 26     public void setName(String name) {27         this.name = name;28     }29 30     public int getAge() {31         return age;32     }33 34     public void setAge(int age) {35         this.age = age;36     }37 38     @Override39     public String toString() {40         return "Person [name=" + name + ", age=" + age + "]";41     }42 }
复制代码

ObjectStreamDemo 

复制代码
 1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.io.ObjectInputStream; 5 import java.io.ObjectOutputStream; 6  7 public class ObjectStreamDemo { 8     public static void main(String[] args) throws IOException, ClassNotFoundException { 9 //        write();10         11         read();12     }13 14     private static void read() throws IOException, ClassNotFoundException {15         //反序列化对象16         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oss.txt"));17         //接收对象是Object18         Object ob = ois.readObject();19         20         ois.close();21         22         System.out.println(ob);23     }24 25     private static void write() throws IOException {26         //创建序列化输出流27         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oss.txt"));28         29         Person p = new Person("熊大", 16);30         31         oos.writeObject(p);32         33         oos.close();34     }35 }
复制代码

 

 

 

http://www.jianshu.com/u/629a2cf13fe9
原创粉丝点击