java中的序列化流和反序列化流

Posted ReShadow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的序列化流和反序列化流相关的知识,希望对你有一定的参考价值。

序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。    对象 -- 流数据(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     @Override
39     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         //接收对象是Object
18         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 }

 

 

 

以上是关于java中的序列化流和反序列化流的主要内容,如果未能解决你的问题,请参考以下文章

编程进阶:Java小白的序列化Serializable接口

java 21 - 13 IO流之序列化和反序列化

在Java中进行序列化和反序列化

java基础序--列化和反序列化

Java之文件流(26个Demo)

Java序列化和反序列化