开发者

Java部分序列化之关键字transient使用及说明

目录
  • Java关键字transient使用
    • JAVA序列化
    • 这里有一个Company类
    • 有一个Employee类
    • 测试方法
  • 总结

    Java关键字transient使用

    JAVA序列化

    Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。

    当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象。所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。

    往往存在这样的场景,一个类中有些参数被序列化毫无意义。序列化只会增加磁盘或者网络传输的大小。一个类中有些敏感信息,比如密码等python。序列化后安全性降低。一个类中存在某个对象无法被序列化。而这个对象来自框架或者系统层面。

    这个时候我们可以使用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) {python
    		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 FileNotFoundjsException, 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 FileOutpu编程客栈tS编程tream("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());
    	}
    
    }
    
    

    Java部分序列化之关键字transient使用及说明

    我们都知道如果Employee没有实现Serializable。这样序列化Company的时候,会抛出异常 java.io.NotSerializableException。

    这是因为无法序列化Company中变量Employee。但是使用transient可以实现部分序列化。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜