内容来自《Offer来了》
Java序列化API为处理对象序列化提供了一个标准机制,具体的Java系列化需要注意以下事项。
◎ 类要实现序列化功能,只需实现java.io.Serializable接口即可。
◎ 序列化和反序列化必须保持序列化的ID一致,一般使用privatestatic final long serialVersionUID定义序列化ID。
◎ 序列化并不保存静态变量。
◎ 在需要序列化父类变量时,父类也需要实现Serializable接口。
◎ 使用Transient关键字可以阻止该变量被序列化,在被反序列化后,transient变量的值被设为对应类型的初始值,例如,int类型变量的值是0,对象类型变量的值是null。
具体的序列化实现代码如下:
import java.io.Serializable;
//通过实现Serializable接口定义可序列化的Worker类
public class Wroker implements Serializable {
//定义序列化的ID
private static final long serialVersionUID = 123456789L;
//name属性将被序列化
private String name;
//transient修饰的变量不会被序列化
private transient int salary;
//静态变量属于类信息,不属于对象的状态,因此不会被序列化
static int age =100;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
以上代码通过implements Serializable实现了一个序列化的类。注意,transient修饰的属性和static修饰的静态属性不会被序列化。
对象通过序列化后在网络上传输时,基于网络安全,我们可以在序列化前将一些敏感字段(用户名、密码、身份证号码)使用秘钥进行加密,在反序列化后再基于秘钥对数据进行解密。这样即使数据在网络中被劫持,由于缺少秘钥也无法对数据进行解析,这样可以在一定程度上保证序列化对象的数据安全。