transient

transient

 关键字,主要用于控制对象序列化的行为
 只能用于修饰类的成员变量,不能用于修饰方法、类或接口等其他元素。当一个成员变量被声明为transient时,在对象进行序列化操作时,这个变量将不会被包含在序列化的结果中。

作用

 Java 的序列化机制允许将对象转换为字节流,以便在网络上传输或保存到文件中。但有些情况下,类中的某些成员变量不应该被序列化,例如:
  包含敏感信息的变量:如密码、信用卡号等,为了保证数据的安全性,不希望这些信息被序列化和传输。
  依赖于当前运行环境的变量:如文件句柄、网络连接等,这些变量在不同的环境中可能无法恢复其状态,因此不需要序列化。
   序列化原理:当对一个对象进行序列化时,首先会检查该对象是否实现了Serializable接口。如果实现了该接口,就会按照一定的规则将对象的各个属性依次转换为字节流。对于基本数据类型,会直接将其值转换为对应的字节表示;对于引用类型,会递归地对引用的对象进行序列化。
   反序列化原理:反序列化过程会读取字节流,根据字节流中的信息创建对象,并将字节流中的数据依次赋值给对象的各个属性。在创建对象时,会调用对象的无参构造函数(如果没有自定义构造函数,则调用默认构造函数),然后再将字节流中的数据填充到对象的属性中。

使用场景

 保护敏感信息:当类中包含敏感数据时,使用transient关键字可以避免这些数据在序列化过程中被泄露。
 节省存储空间:对于一些临时数据或可以在反序列化后重新计算的变量,将其声明为 transient 可以减少序列化数据的大小,节省存储空间和传输带宽。

注意事项

 初始化问题:被transient修饰的变量在反序列化(字节流转为对象)后会被初始化为默认值(如 null、0 等),因此在反序列化后可能需要手动对这些变量进行初始化。
 与静态变量的关系:静态变量本身不会被序列化,因为静态变量属于类而不是对象,所以transient关键字对静态变量没有影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容