当前位置: 首页 > news >正文

第十六章 Java为什么使用序列化

为何要指定serialVersionUID的值

如果不指定显示serialVersionUID的值,jvm在序列化时会自动生成一个serialVersionUID,跟属性一起序列化,再进行持久化或者网络传输,在反序列化时,jvm会根据属性自动生成一个新版的serialVersionUID,与旧的serialVersionUID进行比较,相同则反序列化成功。

特性

被transient关键字修饰的属性不会被序列化, static属性也不会被序列化。

因为序列化是针对对象的,static属性是优于对象的存在,随着类加载而加载,不会被序列化。

serialVersionUID属性并没有被序列化, JVM在序列化对象时会自动生成一个serialVersionUID, 然后将我们显示指定的serialVersionUID属性值赋给自动生成的serialVersionUID。

transient关键字修饰的属性不会被序列化

Java中的transient关键字,transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。 因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。

在持久化对象时,对于一些特殊的数据成员(如用户的密码,银行卡号等),我们不想用序列化机制来保存它。为了在一个特定对象的一个成员变量上关闭序列化,可以在这个成员变量前加上关键字transient。

用来表示一个成员变量不是该对象序列化的一部分。当一个对象被序列化的时候,transient型变量的值不包括在序列化的结果中。而非transient型的变量是被包括进去的。 注意static修饰的静态变量天然就是不可序列化的。

transient关键字可以修饰局部变量吗? 不能!

transient关键字只能修饰变量,而不能修饰方法和类。注意,局部变量是不能被transient关键字修饰的,我想因为这些局部变量需要在被序列化的时候引用到,如果这写局部变量被 transient修饰,变量值不被序列化,反序列化后局部变量的值就变成默认值了,此时反序列化就没有意义了。

Java中的变量

  1. 成员变量(实例变量,属性)

  1. 局部变量(本地变量)

  1. 类变量(静态属性)

相关文章:

  • 【C语言】memcpy , memset等内存操作函数使用方法与注意事项
  • Linux版本现状
  • 硬刚ChatGPT!文心一言能否为百度止颓?
  • Python人脸识别
  • Java每日一练(20230313)
  • 【前端】深入浅出缓存原理
  • Vue中实现路由跳转的三种方式详细分解
  • 写给20、21级学生的话
  • IDEA常用插件列表
  • 为什么 Python 没有 main 函数?
  • 我用Python写了一个下载网站所有内容的软件,可见即可下,室友表示非常好用
  • 网络工程师必备知识点
  • 嵌入式软件开发之Linux 用户权限管理
  • 计算机网络面试总结
  • 求最大公约数和最小公倍数---辗转相除法(欧几里得算法)
  • 一文带你吃透操作系统
  • 基于stm32智能语音电梯消毒系统
  • JS中sort()方法返回值?
  • Python雪花代码
  • 蓝桥杯第五天刷题
  • https://app.hackthebox.com/machines/Inject
  • Spring —— Spring简单的读取和存储对象 Ⅱ
  • 渗透测试之冰蝎实战
  • Mybatis、TKMybatis对比
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读