计算机系统应用教程网站

网站首页 > 技术文章 正文

Java transient关键字使用小结

btikc 2024-09-11 01:58:58 技术文章 16 ℃ 0 评论

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"));

    }

}

程序将输出:

0

date 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。

-----------------------------------

?著作权归作者所有:来自51CTO博客作者juxiangwu的原创作品,请联系作者获取转载授权,否则将追究法律责任

Java transient关键字使用小结及一些需要注意的细节

https://blog.51cto.com/wujuxiang/430211

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表