首页 > 编程语言 >java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化

java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化

时间:2023-12-06 19:44:55浏览次数:39  
标签:变量 关键字 transient 修饰 序列化 属性

java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化

这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先给出这篇文章的大致脉络首先,介绍了transient的基本概念和基本用法、然后,介绍深入分析一下transient关键字,并介绍几个需要掌握的问题最后,来个总结一、初识transient关键字其实这个关键字的作用很好理解,就是简单的一句话:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。概念也很好理解,下面使用代码去验证一下:然后我们在Test中去验证一下:从上面可以看出,在序列化SerializeUser方法中,首先创建一个序列化user类,然后将其写入到G://Test/template路径中。在反序列化DeSerializeUser方法中,首先创建一个File,然后读取G://Test/template路径中的数据。这就是序列化和反序列化的基本实现,而且我们看一下结果,也就是被transient关键字修饰的age属性是否被序列化。从上面的这张图可以看出,age属性变为了0,说明被transient关键字修饰之后没有被序列化。二、深入分析transient关键字为了更加深入的去分析transient关键字,我们需要带着几个问题去解读:(1)transient底层实现的原理是什么?(2)被transient关键字修饰过得变量真的不能被序列化嘛?(3)静态变量能被序列化吗?被transient关键字修饰之后呢?带着这些问题一个一个来解决:1、transient底层实现原理是什么?java的serialization提供了一个非常棒的存储对象状态的机制,说白了serialization就是把对象的状态存储到硬盘上 去,等需要的时候就可以再把它读出来使用。有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到磁盘中。2、被transient关键字修饰过得变量真的不能被序列化嘛?想要解决这个问题,首先还要再重提一下对象的序列化方式:Java序列化提供两种方式。一种是实现Serializable接口另一种是实现Exteranlizable接口。 需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。从上面的这两种序列化方式,我想你已经看到了,使用Exteranlizable接口实现序列化时,我们自己指定那些属性是需要序列化的,即使是transient修饰的。下面就验证一下首先我们定义User1类:这个类是被Externalizable接口修饰的然后我们就可以测试了上面,代码分了两个方法,一个是序列化,一个是反序列化。里面的代码和一开始给出的差不多,只不过,User1里面少了age这个属性。然后看一下结果:结果基本上验证了我们的猜想,也就是说,实现了Externalizable接口,哪一个属性被序列化使我们手动去指定的,即使是transient关键字修饰也不起作用。3、静态变量能被序列化吗?没被transient关键字修饰之后呢?这个我可以提前先告诉结果,静态变量是不会被序列化的,即使没有transient关键字修饰。下面去验证一下,然后再解释原因。首先,在User类中对age属性添加transient关键字和static关键字修饰。然后,在Test类中去测试最后,测试一下,看看结果结果已经很明显了。现在解释一下,为什么会是这样,其实在前面已经提到过了。因为静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,而我们的序列化是写到磁盘上的,所以JVM查找这个静态变量的值,是从全局区查找的,而不是磁盘上。user.setAge(18);年龄改成18之后,被写到了全局区,其实就是方法区,只不过被所有的线程共享的一块空间。因此可以总结一句话:静态变量不管是不是transient关键字修饰,都不会被序列化三、transient关键字总结java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。像银行卡、密码等等这些数据。这个需要根据业务情况了。感谢大家支持举报/反馈 原文链接:https://baijiahao.baidu.com/s?id=1636557218432721275&wfr=spider&for=pc

标签:变量,关键字,transient,修饰,序列化,属性
From: https://www.cnblogs.com/sunny3158/p/17880368.html

相关文章

  • 09-序列化器的 many=True 实现原理
    入门知识上面说明了,解释器会先执行new方法,再执行init方法下面说明了,如果new返回的空对象不是当前init对应的类型,就不会执行init。序列化器many=True的简化版可以看到many_init方法返回的是Alist的空对象,而不是A的空对象,因此,没有Ainit打印1.BookSerializer(da......
  • 使用new关键字,是用来调用这个对象,并给了一个新名字和内存
    new关键字是用于创建对象的关键字。它会分配内存并初始化对象。当我们使用new关键字创建对象时,会自动调用该对象的构造方法。构造方法可以用于初始化类的属性,并为对象分配内存。例如,以下代码定义了一个Person类:publicclassPerson{   privateStringname;   private......
  • .NET(C#) new 关键字的三种用法
    在.NET中使用C#编程时,new关键字具有多种用途,主要包括实例化对象、隐藏继承的成员以及创建匿名类型。下面详细介绍这些用途:1.实例化对象new关键字最常见的用途是创建一个类的实例。当使用new创建对象时,它为对象分配内存并调用构造函数来初始化该对象。这是创建任何类或......
  • constexpr关键字
    文章参考:爱编程的大丙(subingwen.cn)1.const关键字const关键字的判断:限制为常量。只有在声明时使用字面量初始化的才是常量,可以进入符号表。voidfunc(constinta){ //只读变量...}intx=0;constinta=x; //只读变量constintb=10; //常量......
  • nullptr关键字
    文章参考:爱编程的大丙(subingwen.cn)C使用NULL表示空,其定义为:#defineNULL((void*)0)在C++中同样定义了NULL,C和C++虽然都是强类型语言,但是C++对语言的要求更高,不允许(void*)类型进行隐式的类型转化,因此如果沿袭C中NULL的定义,那么下述代码会出错:int*p=NULL;因此C++......
  • c++ friend关键字 友元
     在C++中,friend关键字用于声明友元函数或友元类1。友元函数或友元类可以访问当前类的私有成员和保护成员,即使它们不是当前类的成员函数或成员类1。友元函数是一个独立的函数,而友元类是一个类可以访问另一个类的私有成员和保护成员1。例如,如果要声明函数为一个类的友元,需要......
  • 学C笔记归纳 第四篇——static关键字(重点)
    C语言本身内置了关键字,并非自己创建,也不能自己创建。static的功能:static功能修饰局部变量转变储存位置,延长局部变量生命周期,也可以保持其值不变修饰全局变量将外部链接属性变为内部连接属性,使作用域变小,其他源文件(.c)就不能再使用这个全局变量了,增加程序安全性模块内函......
  • centos查看日志文件内容,包含某个关键字的前后5行日志内容
    简述centos查看日志的几种方法centos查看日志文件内容,包含某个关键字的前后5行日志内容前情提示系统:一说部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有#号、删除线、不操作、不执行字样的为提示或者备份bash,实际不执行如果无法下载......
  • 【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几
    简述centos查看日志的几种方法centos查看日志文件内容,包含某个关键字的前后5行日志内容前情提示系统:一说部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有#号、删除线、不操作、不执行字样的为提示或者备份bash,实际不执行如果无法下载......
  • 序列化
    一,序列化主要分为通过函数进行序列化与反序列化达到传输数据的效果。根据情况可分为两种。第一种,python与不同语言间进行交流,比如,后端语言,javacc++c#等,因为需要使用都可以识别的数据类型进行传输,所有便诞生了Json模块。Json模块主要分为四个功能,dumps、dump、loads、......