IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Java中的transient关键字 -> 正文阅读

[开发工具]Java中的transient关键字

transient关键字简述

将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。
关于序列化:
Java序列化提供两种方式。

  • 一种是实现Serializable接口
  • 另一种是实现Exteranlizable接口。 需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。

代码:

public class TransientTest {

    public static void main(String[] args) {
        //序列化Person对象,再反序列化读取
        Person person = new Person("张三", 22);
        System.out.println("序列化前:");
        System.out.println(person);
        System.out.println(person.getOCCUPATION());
        System.out.println(person.getTEST());

        ByteOutputStream bos = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try {
            //序列化person
            bos = new ByteOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(person);
            oos.flush();
            //序列化后,改变被static修饰的成员变量、被static transient修饰的成员变量
            person.setOCCUPATION("厨师");
            person.setTEST("测试");
            //反序列化person
            ois = new ObjectInputStream(bos.newInputStream());
            Person deserialization = (Person) ois.readObject();
            System.out.println("反序列化后");
            System.out.println(deserialization);
            System.out.println(deserialization.getOCCUPATION());
            System.out.println(deserialization.getTEST());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (oos != null){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ois != null){
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class Person implements Serializable {

    private String name;
    private transient int age;
    public static String OCCUPATION = "程序猿";
    public static transient String TEST = "test";

    public Person() {}
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getOCCUPATION() {
        return OCCUPATION;
    }

    public void setOCCUPATION(String OCCUPATION) {
        Person.OCCUPATION = OCCUPATION;
    }

    public String getTEST() {
        return TEST;
    }

    public void setTEST(String TEST) {
        Person.TEST = TEST;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


运行结果:
序列化前:
Person{name=‘张三’, age=22}
程序猿
test
反序列化后
Person{name=‘张三’, age=0}
厨师
测试
简析:
可以看到加了transient关键字的int类型的age并没有被序列化成功,而是默认的值0。

深入transien关键字

transient的底层实现原理

java的serialization提供了一个非常棒的存储对象状态的机制,serialization就是把对象的状态存储到硬盘上 去,等需要的时候就可以再把它读出来使用。有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到磁盘中

被transient关键字修饰过得变量真的不能被序列化嘛?

是的

静态变量能被序列化吗?被transient关键字修饰之后呢?

静态变量是不会被序列化的,即使没有transient关键字修饰,因为静态成员变量实际上是属于类,而不是对象。

静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,而我们的序列化是写到磁盘上的,所以JVM查找这个静态变量的值,是从全局区查找的,而不是磁盘上。上面在改变static修饰的变量是在序列化后,但打印反序列化的对象的被static修饰的变量也同样改变了;这是因为在改变static修饰的变量时,是被写到了全局区,其实就是方法区,只不过被所有的线程共享的一块空间。
因此:
静态变量不管是不是transient关键字修饰,都不会被序列化

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:40:00  更:2022-04-09 18:41:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:47:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码