Java 关键字transient与注解@Transient的区别_transient注解
在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。
当一个对象被序列化时,被声明为 transient 的字段将不会被保存到序列化的结果中
主要用途:
敏感信息隐藏: transient 可以用于隐藏对象中的敏感信息,确保它们不会被持久化到存储设备或通过网络传输
临时数据: 有些字段在持久化时不需要被保存,比如缓存或临时计算的数据
注意事项:
transient 只能用于字段,不能用于类或方法
被声明为 transient 的字段在反序列化时会被设置为默认值,如 null(对于对象)、0(对于基本数据类型)或 false(对于布尔类型)
序列化过程中,transient 字段的内容不会被保存到序列化结果中
transient 只影响对象的序列化,不影响其它方面的行为,比如字段的访问权限等。
public class Test { public static void main(String[] args) throws IOException, ClassNotFoundException { Person person = new Person(\"Alice\", \"123456\"); // 序列化对象 FileOutputStream fileOutputStream = new FileOutputStream(\"序列化对象.txt\"); ObjectOutputStream out = new ObjectOutputStream(fileOutputStream); out.writeObject(person); out.close(); // 反序列化对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream(\"序列化对象.txt\")); Person deserializedPerson = (Person) in.readObject(); in.close(); // 输出反序列化后的对象 // Person{name=\'Alice\', password=\'null\'} System.out.println(deserializedPerson.toString()); }}
在Java的POJO中,@Transient
注解的主要作用是标记某个字段不需要被持久化到数据库。具体来说:
-
与Java
transient
关键字的区别:-
transient
关键字是Java原生特性,用于标记字段在对象序列化时(如通过Serializable
接口)应被忽略。 -
@Transient
注解则是针对数据持久化的,仅影响ORM框架的行为,不影响序列化。 -
注意:JPA默认也会忽略用
transient
关键字修饰的字段,但显式使用@Transient
注解更符合规范且可读性更强。import javax.persistence.Entity;import javax.persistence.Transient;@Entitypublic class User { private Long id; private String username; private String password; @Transient // 该字段不会保存到数据库 private String confirmPassword; // Getters and Setters}
总结:
@Transient
注解在POJO中用于标识字段无需持久化到数据库,常用于临时数据或避免ORM框架的映射错误。注意区分它与Javatransient
关键字的不同应用场景。
-