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可以实现部分序列化。

猜你喜欢

转载自blog.csdn.net/xu_coding/article/details/86654524
今日推荐