序列化
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
java序列化
Java语言内置了序列化和反序列化,通过Serializable接口实现。
Serializable
public class Account implements Serializable {
private String name;
private String pwd;
}
序列与反序列化
public class TestSerializable {
public static void serialize(Account account, String fileName) throws IOException {
// 将Account对象保存到文件中
FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(account);
oos.flush();
oos.close();
fos.close();
}
public static Account deserialization(String file) throws IOException, ClassNotFoundException {
// 读取Account的内容
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Account account = (Account) ois.readObject();
ois.close();
fis.close();
return account;
}
public static void main(String[] args) {
Account account = new Account();
account.setName("张三");
String fileName = "a";
// 序列化
try {
serialize(account,fileName);
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try {
System.out.println(deserialization(fileName).getName());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
序列化兼容性
序列化的兼容性指的是对象的结构变化(如对属性增删改,属性修饰符改变等)对序列化的影响。为了能够识别对象结构的变化,Serializable使用serialVersionUID字段来标识对象的结构。默认情况下,它会根据对象的数据结构自动生成,结构发生变化后,它的值也会跟随变化。虚拟机在反序列化的时候会检查serialVersionUID的值,如果字节码中的serialVersionUID和要被转换的类型的serialVersionUID不一致,就无法进行正常的反序列化。为了更好的兼容性,在序列化的时候,最好将serialVersionUID的值设置为固定的。
public class Account implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String pwd;
}
哪些场景需要序列化
一般来说如果你的对象需要网络传输或者持久化(对象直接转换为字节的形式传输),只要你的对象需要转换为字节的形式那么你的对象就要实现Serializable接口。比如使用dubbo使用rpc的方式调用接口,那么接口参数就一定要实现Serializable接口。
如果只是转换为字符串的形式与网络打交道,那么就不需要实现Serializable接口。