1. Serializable接口
1.仅是一个标记接口,不包括任何方法。
2.Java的对象序列化是将实现了Sreializable接口的对象转化成一个字节序列,并在以后可以将其将其回复为原来的对象,甚至是通过网络。
3. 实现轻量级(在代码中显式地序列化和反序列化)持久性(对象的生命周期不取决于程序是否正在运行)
4. 为什么要序列化?java将对象作为参数传递时,传的是引用,即内存地址,序列化则将对象转化为文本格式数据,可以直接在网络中传输。
2. 实现序列化
- 创建OuputStream对象,将其分装在一个ObjectOuputStream对象中
- 调用writeObject()方法即可序列化对象
反序列化则使用InputStream与ObjectInputStream.readObject()。
对象的序列化同时还会序列化对象中包含的引用所指向的对象(包括这些对象所包含的引用,依此类推)。
在反序列化恢复对象时,并不调用对象的任何构造函数,只根据字节数据。只需要保证jvm可以找到相关的 .class文件。
3. 序列化控制
transient :该关键字修饰的属性,是不会被序列化的。
static:静态的属性也不会被序列化。(直接序列化Class对象可以更方便地保存静态属性)
4. serialVersionUID
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。
实现Serializable 接口,一定要为 serialVersionUID 赋值(java可以自动赋值)。