在要序列化类中添加字段,保证序列化和反序列化是同一个格式的类
private static final long serialVersionUID = 100L;
这个我称之为:序列化号,用来记住序列化时类的格式,比如,我在第一次序列化时,Person类有name,age两个属性,但是后来因为需求删去了age属性,此时如果在第一次序列化时没有定义序列化号,那么你第一次序列化的那个码就不能反序列化出原来的属性; 但是,如果在第一次序列化时,Person类中定义了这个序列化号,这个序列化号就会在序列化过程中存入得到的那个码里,这时如果删去age属性,反序列化还会进行,因为序列化号记得当初的格式
代码演示:
import java.io.*;
public class DuiXiang {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//objectOutputStreamUsage();
objectInputStreamUsage();
}
// 写:将对象进行序列化
public static void objectOutputStreamUsage() throws Exception{
//1.实例化一个Person的对象
Person person = new Person("裴先生", 10);
//2.实例化一个对象输出流的对象
ObjectOutputStream output = null;
output = new ObjectOutputStream(new FileOutputStream("d:\\duixiang.txt"));
//3.将对象写入到流中
output.writeObject(person);
//4.刷新
output.flush();
output.close();
System.out.println("序列化完成");
}
// 读:反序列化
public static void objectInputStreamUsage() throws Exception {
//1.实例化对象输入流的对象
ObjectInputStream input = new ObjectInputStream(new FileInputStream("d:\\duixiang.txt"));
//2.读取
Object object = input.readObject();
//3.对象的向下转型
if (object instanceof Person) {
Person p = (Person) object;
System.out.println(p.name + p.age);
}
}
}
Person.java
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 100L; //序列化号,用来记住序列化时类的格式,比如,我在第一次序列化时,Person类有name,age两个属性,但是后来因为需求删去了age属性,此时如果在第一次序列化时没有定义序列化号,那么你第一次序列化的那个码就不能反序列化出原来的属性; 但是,如果在第一次序列化时,Person类中定义了这个序列化号,这个序列化号就会在序列化过程中存入得到的那个码里,这时如果删去age属性,反序列化还会进行,因为序列化号记得当初的格式
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}