zoukankan      html  css  js  c++  java
  • 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"));
        }

    }

    程序将输出:
    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。

  • 相关阅读:
    Android 判断app何时是打开或者关闭的技术研究
    JSON返回DateTime/Date('123123123')/解决办法
    SpringMVC日期类型转换问题三大处理方法归纳
    jackson 转json. 过滤null值
    将java.util.Date类型转换成json时,使用JsonValueProcessor将date转换成希望的类型
    jackson 实体转json 为NULL或者为空不参加序列化
    美工与程序猿的Web工作怎样做到相对分离?
    jQuery 序列化表单数据 serialize() serializeArray()
    iOS开发- 隐藏状态栏(电池栏)
    《Programming Hive》读书笔记(一)Hadoop和hive环境搭建
  • 原文地址:https://www.cnblogs.com/KingIceMou/p/7258148.html
Copyright © 2011-2022 走看看