在使用序列化和反序列化的过程中我们需要注意一些小细节
1.假设我们先用序列化把对象写到本地文件当中
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private int num;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name=" + name + ", age = " + age + "}";
}
}
public class ObjectStreamDemo2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("\\myio\\f.txt"));
Student o = (Student) ois.readObject();
System.out.println(o);
ois.close();
}
}
2.然后第二步,我们在Javabean当中对Student类进行一个修改
比如说加上一个属性private int num 表示学生的学号
private String name;
private int age;
private int num;
3.在使用反序列化将对象读取到内存当中
结果你发现他报错了,原因如下:
如果一个类实现了Serializable接口,那就表示这个类的对象是可被序列化的,那么Java的底层会根据这个类的成员变量、静态变量、构造方法、成员方法等进行计算,得出一个long类型的序列号,那么此时我们在创建一个对象的时候,在对象里面就包含了序列号,用序列化写到本地文件中的时候,也会把序列号写到文件当中,但是如果此时你修改了Javabean类中的代码,那么Java底层会重新计算出一个序列号,当我们用反序列化把对象读取到内存中之后就会发现两个序列号不一样,代码直接报错。简单来说就是文件中的序列号和Javabean的序列号不匹配导致的。
解决方案:固定序列号
在最上面定义Javabean类的时候,手动的把序列号先定义出来
private static final long serialVersionUID = 1L;
重新运行后,打印出
补充:
transient:瞬态关键字
作用:不会把当前属性序列化到本地文件当中
序列化后进行反序列化打印时发现
age为初始值