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

 更新时间:2025年09月30日 09:10:06   作者: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可以实现部分序列化。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot加载外部依赖过程解析

    SpringBoot加载外部依赖过程解析

    这篇文章主要介绍了SpringBoot加载外部依赖过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 基于binarywang封装的微信工具包生成二维码

    基于binarywang封装的微信工具包生成二维码

    这篇文章主要介绍了基于binarywang封装的微信工具包生成二维码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • java对象转换String类型的三种方法

    java对象转换String类型的三种方法

    在很多情况下我们都需要将一个对象转换为String类型。一般来说有三种方法可以实现:Object.toString()、(String)Object、String.valueOf(Object)。下面对这三种方法一一分析
    2013-11-11
  • javaSE基础如何通俗的理解javaBean是什么

    javaSE基础如何通俗的理解javaBean是什么

    所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件。这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专有名词搞的晕头转向
    2021-10-10
  • 基于idea把springboot项目部署到docker

    基于idea把springboot项目部署到docker

    这篇文章主要介绍了基于idea把springboot项目部署到docker,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • SpringBoot请求映射的五种优化方式小结

    SpringBoot请求映射的五种优化方式小结

    在Spring Boot应用开发中,请求映射(Request Mapping)是将HTTP请求路由到相应控制器方法的核心机制,合理优化请求映射不仅可以提升应用性能,还能改善代码结构,增强API的可维护性和可扩展性,本文将介绍5种Spring Boot请求映射优化方式,需要的朋友可以参考下
    2025-06-06
  • Java数据结构之对象比较详解

    Java数据结构之对象比较详解

    这篇文章主要为大家详细介绍了Java中对象的比较、集合框架中PriorityQueue的比较方式以及PriorityQueue的模拟实现,感兴趣的可以了解一下
    2022-07-07
  • Spring Boot Actuator端点相关原理解析

    Spring Boot Actuator端点相关原理解析

    这篇文章主要介绍了Spring Boot Actuator端点相关原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    这篇文章主要介绍了Java线程操作的常见方法,结合实例形式总结分析了java线程的创建、线程名称的获取、设置以及线程启动的判断等相关操作实现技巧,需要的朋友可以参考下
    2019-10-10
  • Spring Bean生命周期源码原理图解

    Spring Bean生命周期源码原理图解

    这篇文章主要介绍了Spring Bean生命周期源码原理图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10

最新评论