对象序列化中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
阅读全文
0 0
- 对象序列化中java.io.InvalidClassException的解决方法
- java.io.InvalidClassException序列化
- 类序列化问题-java.io.InvalidClassException
- 对象反序列化异常原因:java.io.InvalidClassException
- JAVA--java.io.InvalidClassException
- java.io.InvalidClassException翻译
- java.io.InvalidClassException
- java.io.InvalidClassException 异常
- java.io.InvalidClassException异常
- Java中对象的序列化(实现java.io.Serializable)
- java.io.InvalidClassException:PublishInfMsg(类名); local class incompatible: 解决方法
- Java IO 中对象的序列化操作
- JAVA序列化在IO中读写对象的使用
- java.io.InvalidClassException异常处理
- Java Exception: java.io.InvalidClassException solution
- JAVA--java.io.InvalidClassException急解
- java.io.InvalidClassException: javax.management.MBeanAttributeInfo
- Java的IO流与对象的序列化浅谈
- [LeetCode]36. Valid Sudoku
- 【1402】数字根
- 筛选质数
- 51nod 1183 编辑距离
- 基于WFST的字素因素转换(g2p):开源组件
- 对象序列化中java.io.InvalidClassException的解决方法
- java中的各种数据类型在内存中存储的方式
- TCP/IP-数据链路层
- java部分数据类型之间的转换
- 浓墨重彩之MySQL-08-表单查询(2)
- 异常
- Java的常用的代码块(一)
- 2017最新Node.js开发微信公众号视频教程
- python 虚拟环境配置(一)