什么是序列化
序列化:把对象写入io流中
反序列化:从io流中恢复对象
为什么要序列化
为了方便传输
举例说明:我要给我的朋友邮寄一箱饼干,但是因为体积太大,就全压成粉末紧紧的一包寄过去。只不过java还有反序列化可以还原
如何实现序列化
- 实现Externalizable接口
public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
- 或者Serializable接口
public interface Serializable {
}
什么场景需要序列
- java中两个进程之间需要通信的时候
- 想把内存中的对象保存到硬盘中的时候
注意
- 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
- 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
- 并非对象的所有字段都可以序列化,例如transient修饰的字段、static修饰的变量,因为不在堆内存中,序列化只会序列化堆内存
serialVersionUID的作用
序列化对象版本控制
serialVersionUID的显示方式
一是默认的1L,比如:private static final long serialVersionUID = 1L;
二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
Serializable 实现序列化
@Data
@Builder
public class Person implements Serializable {
private static final long serialVersionUID = -5809782578272943999L;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private int age;
/**
* 性别
*/
private String sex;
}
/**
* 序列化
* @throws IOException
*/
@Test
public void serialize() throws IOException {
Person p = Person.builder().age(18).name("wangshuang").sex("female").build();
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d:/person.txt"));
out.writeObject(p);
out.close();
}
运行完上面的方法,我的d盘出现
内容如下
ObjectOutputStream代表对象输出流
/**
* 反序列化
* @throws IOException
* @throws ClassNotFoundException
*/
@Test
public void deserialize() throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("d:/person.txt"));
Person p = (Person)in.readObject();
System.out.println(p);
}
运行结果: Person(name=wangshuang, age=18, sex=female)
ObjectInputStream代表对象输入流