序列化的本质: 将数据转化成二进制字节码文件(对象输出流),由java虚拟机完成,不由程序员完成。
序列化是将一个对象的状态(属性的值)保存起来,然后在适当的时候获得。
序列化分为两部分:序列化—将对象转化成二进制和反序列化—将二进制转化成对象。
序列化是这个过程的第一步,将数据分解成字节流,一般存储在文件中或在网络上传输。
反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,于是还有恢复数据。恢复数据要求有恢复数据的对象实例。
对象序列化要求对象实现序列化接口
public class Student implements Serializable {
private static final long serialVersionUID = -1384354585029029786L;
public String id;
public String name;
public String sex;
}
情景:两个平台使用序列化进行数据传输,反序列化是否成功不经取决于反序列化本身还取决于serialVersionUID。
总结:
其实序列化的作用是能转化成Byte流,然后又能反序列化成原始的类。能在网络进行传输,也可以保存在磁盘中,有了SUID之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID变了,那么反序列化的时候就不会变成原始的类了,还会抛异常,主要就是用于版本控制
@Test
public void serialize() throws Exception{
try {
// Student stu=new Student("1001","十一郎","男");
Serializable stu1=new Student("1001","十一郎","男");
OutputStream os=new FileOutputStream("G:\\aaa\\1.txt");
//对象输出流
ObjectOutputStream oos=new ObjectOutputStream(os);
oos.writeObject(stu1);
oos.flush();
oos.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
@Test
public void deserialize(){
Student stu=null;
try {
InputStream is=new FileInputStream("G:\\aaa\\1.txt");
ObjectInputStream oos=new ObjectInputStream(is);
stu=(Student)oos.readObject();
System.out.println(stu.getName());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}