默认情况下当执行了对象序列化的时候,会将类中的全部属性的内容进行全部的序列化,但是很多情况下,有一些属性并不需要序列化的处理,所以只需要在属性上定义transient关键字就可以了。
例如:
private transient String name;
在这个时候在进行序列化处理的时候,name属性的内容是不会被保存下来,换言之,读取到的name属性的内容就是' null '.
import java.io.*;
@SuppressWarnings("serial")
class Person implements Serializable{ // Serializable接口中没有任何方法,其作用是描述类的能力,和克隆接口一样
// 此时 Person类可以被序列化
// private static final long serialVersionUID = 1L; // 为了防止反序列化,一般会加上一个序列号,但是意义不大,因为可以选择@SuppressWarnings("serial")压制
private transient String name;
int age;
public Person(String name,int age){
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MAIN {
private static final File SAVE_FILE = new File("D:" + File.separator + "CDLM.Person");
public static void main(String[] args) throws Exception{
saveObject(new Person("张三",18));
System.out.println(loadObject());
}
public static void saveObject(Object obj) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
oos.writeObject(obj); // 序列化
oos.close();
}
public static Object loadObject() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
Object obj = ois.readObject(); // 反序列化
ois.close();
return obj;
}
}
输出结果
明显可以发现,name属性并没输出出来,所以transient起到了作用。
使用情景:
如果类之中有一些是需要计算保存的属性内容往往是不需要被序列化的,这个时候就不使用,但是在开发之中大部分需要被序列化的类往往都是简单Java类,所以这一个关键字的出现频率并不高。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)