写一段代码理清序列化、反序列化的流程。本篇文章序列化、反序列化用的类是同一个类,可以通过注释main
中1然后修改Stu
类实现有无transient
关键字修饰、serialVersionUID
是否不同,得到以下结果:
- 1、
serialVersionUID
的数值大小不会影响序列化后的字节数大小 - 2、
transient
的有无,会影响序列化后的字节数大小,有transient修饰成员变量,字节数会变小,反之变大 - 3、若某成员变量被
transient
修饰,则该成员变量不能被反序列化,打印结果为null
import java.io.*;
public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Stu stu = new Stu();
stu.setName("goblet");
stu.setAge(20);
stu.setId(1234);
//将对象序列化成字节序列后存入文件--------1
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("\\D:\\1.txt"));
oo.writeObject(stu);
oo.close();
//将字节序列从文件读出后反序列化成对象--------2
ObjectInputStream oi = new ObjectInputStream(new FileInputStream("\\D:\\1.txt"));
Stu stu1 = (Stu) oi.readObject();
System.out.println(stu1);
}
}
class Stu implements Serializable{
private static final long serialVersionUID = 4400986214485757052L;
private String name;
private Integer age;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "id:"+id+" name:"+name+" age:"+age;
}
}
id
未被transient
修饰
id:1234 name:goblet age:20
Process finished with exit code 0
id
被transient
修饰
id:null name:goblet age:20
Process finished with exit code 0
注意!!!:即使序列化时变量被transient
修饰,反序列化不被transient
修饰,仍然无法得到实际变量值,序列化和反序列化是两个不同的流程,使用的类有可能是不同的,只不过本篇文章用的类是同一个类,通过注释main
中的代码得到不同结果。