Java transient关键字使用小结

1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。2、被transient关键字修饰的变量不再能被序列化,香港服务器租用,一个静态变量不管是否被transient修饰,均不能被序列化。3、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。如下面的例子package com.kkoolerter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.Date;public class Main implements Serializable { private static final long serialVersionUID = -5836283489677344417L; private transient int classValue = 10; private transient Date date = new Date(); private transient static int staticValue = 10; public static void main(String[] args) throws Exception { Main m = new Main(); m.classValue = 11; Main.staticValue = 11; ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream( new File(“0xjh000”))); out.writeObject(m); out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream( new File(“0xjh000”))); Main m1 = (Main) in.readObject(); in.close(); System.out.println(m1.classValue); System.out.println((m1.date == null ? “date is null” : “date is not null”)); }}程序将输出:0date is null这就说明了一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。思考一下下面的例子:package com.kkoolerter;import java.io.Externalizable;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectInputStream;import java.io.ObjectOutput;import java.io.ObjectOutputStream;public class ExternalizableTest implements Externalizable { private transient String content = “哈哈~我将会被序列化,不管我是是否被transient关键字修饰”; @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(content); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { content = (String) in.readObject(); } public static void main(String[] args) throws Exception { ExternalizableTest et = new ExternalizableTest(); ObjectOutput out = new ObjectOutputStream(new FileOutputStream( new File(“ext0000”))); out.writeObject(et); ObjectInput in = new ObjectInputStream(new FileInputStream(new File( “ext0000”))); ExternalizableTest et1 = (ExternalizableTest) in.readObject(); System.out.println(et1.content); out.close(); in.close(); }}程序运行后将输出如下结果:哈哈~我将会被序列化,不管我是是否被transient关键字修饰这是为什么呢,香港服务器,不是说类的变量被transient关键字修饰以后将不能序列化了吗?我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若操作的是一个Serializable对象,则所有的序列化将会自动进行,若操作的是 一个Externalizable对象,则没有任何东西可以自动序列化,香港服务器,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。

本文出自 “有思想的代码” 博客,请务必保留此出处

只要心中有希望存在,就有幸福存在。

Java transient关键字使用小结

相关文章:

你感兴趣的文章:

标签云: