transient关键字,transient名词
如何解决写爬虫IP受阻的问题?立即使用。
本教程运行环境:windows7系统,java10版本10,Dell G3电脑。
(学习视频分享:java教学视频)
Java的序列化提供了一种持久化对象实例的机制。一个对象持久化的时候,可能会有一个特殊的对象数据成员,我们不想用序列化机制来保存。
要关闭特定对象的域上的序列化,可以用关键字transient作为域的前缀。
当对象被序列化时,瞬态变量的值不包括在序列化表示中,而非瞬态变量的值包括在内。
总之被transient修饰的变量不参与序列化和反序列化。
接下来用代码来证明。
创建一个新的学生类来实现Serializable接口,并重写其toString方法来观察结果。
年龄属性不会被瞬变修改,而姓名属性会被瞬变修改。
公共类学生实现Serializable {
私人年龄;
私有瞬态字符串名称;
公共学生(){
}
public Student(int age,String name) {
this.age=年龄;
this.name=name
}
@覆盖
公共字符串toString() {
返回 Student{ age= age ,name= name \ }
}
}然后在TransientTest类中测试它。
PS:
为了代码简洁起见,这里的IO操作直接抛出,而不是try catch操作。
公共类TestTransient {
公共静态void main(String[] args)引发异常{
//实例化一个学生对象。
学生学生=新生(15,葛花);
System.out.println(学生);
//将学生对象写入磁盘文件(序列化)
object output stream OOS=new object output stream(new file output stream( student . txt );
oos.writeObject(学生);
OOS . close();
//从磁盘文件中读取学生对象(反序列化)
ObjectInputStream ois=new ObjectInputStream(new file inputstream( student . txt );
student=(学生)ois . read object();
System.out.println(学生);
}
}运行main方法,观察控制台打印信息。
在发现序列化和反序列化之后,name属性从葛花更改为null。
这意味着被transient修饰的变量不参与序列化和反序列化。
那有没有例外呐?
众所周知,java中有两种序列化方式。
1.实现可序列化接口。
2.实现可外部化的接口。
可外部化接口是可序列化接口的子类。
源代码如下
可外部化的公共接口扩展java.io.Serializable {
void write external(object output out)引发IOException
void readExternal(ObjectInput in)引发IOException、ClassNotFoundException。
}这个接口的两个方法可以指定序列化类中的哪些属性。
使用该接口时,无论属性是否被瞬态修改,
默认情况下,不序列化任何属性。所以实现可外部化接口的类
通常,transient不再用于修改属性。
总结:
1. 被transient修饰的变量不参与序列化和反序列化
2. transient一般在实现了Serializable接口的类中使用。
更多编程知识请访问:编程教学!以上是瞬态关键字的作用是什么的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。