transient关键字

来源:互联网 发布:北京软件定制开发 编辑:程序博客网 时间:2024/06/11 21:16
最近在学习java一些底层的知识,顺便通过博客的形式做一些小笔记,方便以后的知识梳理。

1. transient的作用

在java中对象只要实现了Serilizable接口,这个对象就可以被序列化,序列化模式为开发者提供了很多便利,通过实现这个接口我们无需关心序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。


在实际开发过程中,某些类的部分属性需要序列化,而其他属性不需要被序列化,举个例子,部分数据较为敏感,为了安全不希望在网络操作序中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,这时,java中的transient关键字为为我们提供了解决方法,只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient进行定义,序列化对象的时候,被定义的属性就不会被序列化。
2. transient的使用注意点

(1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问,即不能进行反序列化。


(2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。


(3)静态变量不管是否被transient修饰,均不能被序列化

3. transient的不可序列化的反例

对象的序列化可以通过实现两种接口来实现,分别是Serializable接口和Externalizable接口,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

4.@Transient注解
在实现Serializable接口的前提下,在变量加入@Transient注解一样可以取消序列化。目前比较流行的ORM框架上,在实体类的某个字段加入
@Transient注解则表示该字段不进行持久化即不成为数据库字段,如年龄加入@Transient注解不做为数据库字段,根据其生日与当前日期进行计算得
出。



原创粉丝点击