最近在维护系统代码时,发现了变量修饰符transient,这在我以前的项目开发中没有用过。在提及仅仅包含数据的java对象时,最先想到的是PO,VO等。
PO(persistant object) 持久化对象,一般和数据库中的表映射的java对象,在使用Hibernate框架时,常常会直接利用编译器生成PO。而VO(value object) 值对象,通常用在业务逻辑层,对应业务对象。
PO和VO的使用目的是为了降低各层之间的耦合,但是每次都进行二者之间的转换,也是比较麻烦的。考虑到这些,transient似乎起到了微妙的作用,修饰某业务变量时,进行序列化时不必传送此变量。出于安全等考虑角度,在实际项目经验中,对象需要序列化到数据库、JDNI或通过Object流传递给其他对象的话,对象中的非持久性字段也应该考虑加transient关键字。
transient的测试例子:
import java.io.*;
public class TransientTest {
public static void main(String[] args) {
User user = new User("Suky","qwe123");
System.out.println("name:"+user.getName());//name:Suky
System.out.println("pwd:"+user.getPassword());//pwd:qwe123
try {
ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream("transientOUT.text"));
obj.writeObject(user);
obj.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("transientOUT.text"));
User user2 = (User)in.readObject();
in.close();
System.out.println("name2:"+user2.getName());//name2:Suky
System.out.println("pwd2:"+user2.getPassword());//pwd2:null
//测试读出实例,不会执行构造函数
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("transientOUT.text"));
output.writeObject(new User());
output.close();
ObjectInputStream input = new ObjectInputStream(new FileInputStream("transientOUT.text"));
User user3 = (User)input.readObject();
input.close();
System.out.println("name3:"+user3.getName());//name3:Test
System.out.println("pwd3:"+user3.getPassword());//pwd3:null
} catch (Exception e) {
e.printStackTrace();
}
}
}
class User implements java.io.Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String password;//transient
User(){
this.name = "Test";
this.password = "123456";
}
User(String name,String password){
this.name = name;
this.password = password;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getPassword() {return password;}
public void setPassword(String password) {this.password = password;}
}
分享到:
相关推荐
### Java中的transient关键字详解 在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列化过程中对特定变量的控制。当一个类实现了`Serializable`接口时,其对象可以被序列化为一个持久化的...
Java 中的 transient 关键字 在 Java 编程中,transient 关键字是一个非常重要的概念,它用来说明一个属性是临时的,不会被序列化。在 Java 中,序列化是指将对象的状态信息转换为字节流的过程,以便于对象在网络上...
在给定的文件列表中,除了与`transient`关键字相关的`Java之transient关键字.md`文件,其他如`javaweb\Tomcat.md`、`javaweb\Cookie、Session、localStorage、sessionStorage区别和用法.md`等文件可能涉及Web开发中...
深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字) Java序列化和反序列化是Java虚拟机中的一种重要机制,它们可以将Java对象转换为二进制数据,然后...
Java transient关键字原理解析 Java 中的 transient 关键字是一个重要的概念,它被用来表示变量将不被序列化处理。那么在理解 transient 关键字之前,我们先了解下什么是序列化。 序列化是对象进行持久化处理,也...
在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...
Java transient关键字与序列化操作实例详解 Java语言中的transient关键字是用来修饰变量的,表明该变量不会被Java虚拟机(JVM)序列化,即不会被写入到二进制流中。序列化是Java语言中的一种机制,用于将对象转换为...
主要介绍了java中transient关键字用法,以实例形式分析了java中transient关键字的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
Java中的`transient`关键字是用于标记类的成员变量,表明该变量不应该参与序列化过程。当一个类实现了`Serializable`接口,其对象可以被序列化,即将对象的状态转换为字节流,以便存储或在网络中传输。序列化是Java...
在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化密切相关。序列化是指将对象的状态转换为字节流,以便存储或在网络上传输。当一个类实现了`Serializable`接口,它的实例就可以被序列化...
**transient关键字的作用** `transient`关键字用于标记一个实例变量,表示这个变量不应该作为对象状态的一部分进行序列化。当一个对象被序列化时,`transient`修饰的变量会被忽略,它们的值不会包含在序列化的表示中...
#### Transient关键字解析 在Java编程语言中,`transient`是一个非常重要的关键字,主要用于对象的串行化过程中。它用于标记对象中的某些字段,使得这些字段不会被串行化到持久存储介质中。这对于保护敏感数据或...
本篇文章序列化、反序列化用的类是同一个类,可以通过注释main中1然后修改Stu类实现有无transient关键字修饰、serialVersionUID是否不同,得到以下结果: 1、serialVersionUID的数值大小不会影响序列化后的字节数...
【Java编程:transient关键字详解】 在Java编程中,`transient`关键字有着特殊的作用,它主要用于处理对象的序列化过程。序列化是Java提供的一种将对象的状态转换为字节流,以便存储到磁盘或者在网络中传输的技术。...
深入探索Java对象的序列化 对象序列化就是把对象写入到输出流中,用来存储或者传输。...实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:
Java 中序列化 NotSerializableException 问题解决办法 Java 中序列化 NotSerializableException 问题是 ...我们还讨论了什么时候需要标记 transient,以及如何正确地使用 transient 关键字。希望本文能够帮助到大家。