p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 }
序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。 对象 -- 流数据(ObjectOutputStream)
反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)
序列化流和反序列化流不同于字节流 字符流 内存字节流,这些都是把字符串写入/读取文件,序列化流和反序列化流可以将对象写入/读取文本文件中.
但是我们要注意的是,写入和读取的文件要实现Serializable这个接口,当然这个接口是没有任何方法的,直接implements就好,类似于这种没有任何方法的接口被称为标记接口.
可是当我们对原有的对象中的数据改变了之后,直接读取(不写入,在实际开发中不能每改一次就写入一次),就会报错:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 }
span.s1 { text-decoration: underline }
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 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun }
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 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun }