内容来自《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修饰的静态属性不会被序列化。

对象通过序列化后在网络上传输时,基于网络安全,我们可以在序列化前将一些敏感字段(用户名、密码、身份证号码)使用秘钥进行加密,在反序列化后再基于秘钥对数据进行解密。这样即使数据在网络中被劫持,由于缺少秘钥也无法对数据进行解析,这样可以在一定程度上保证序列化对象的数据安全。