Java部分序列化之关键字transient使用及说明
作者:pretty_boy1
Java序列化将对象转为字节序列用于存储或传输,需实现Serializable接口,transient关键字可排除敏感字段或不可序列化对象,避免反序列化时恢复无效数据或泄露信息
Java关键字transient使用
JAVA序列化
Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。
当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象。所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。
往往存在这样的场景,一个类中有些参数被序列化毫无意义。序列化只会增加磁盘或者网络传输的大小。一个类中有些敏感信息,比如密码等。序列化后安全性降低。一个类中存在某个对象无法被序列化。而这个对象来自框架或者系统层面。
这个时候我们可以使用transient关键字。实现部分序列化。transient关键字主要作用是:当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。
示例:
这里有一个Company类
public class Company implements Serializable{ private String companyName; private String companyAddress; private String companyEmail; private transient List<Employee> employees; public Company(String companyName, String companyAddress, String companyEmail, List<Employee> employees) { this.companyName = companyName; this.companyAddress = companyAddress; this.companyEmail = companyEmail; this.employees = employees; } }
有一个Employee类
public class Employee implements Serializable{ private String Name; private String phone; public Employee(String name, String phone) { Name = name; this.phone = phone; } }
测试方法
public class TestSerializable { public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { Employee employee1 = new Employee("张三","1234"); Employee employee2 = new Employee("张四","1234"); Employee employee3 = new Employee("张五","1234"); List<Employee> employees = new ArrayList(); employees.add(employee1); employees.add(employee2); employees.add(employee3); Company company = new Company("百度","百度大厦","3333",employees); ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("rectangle")); // 往流写入对象 o.writeObject(company); o.close(); System.out.println("反序列化之前的雇员" + company.getEmployees()); // 从流读取对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle")); Company company1 = (Company)in.readObject(); System.out.println("反序列化之后的雇员" + company1.getEmployees()); } }
我们都知道如果Employee没有实现Serializable。这样序列化Company的时候,会抛出异常 java.io.NotSerializableException。
这是因为无法序列化Company中变量Employee。但是使用transient可以实现部分序列化。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。