【Java 基础篇】Java transient 关键字详解:对象序列化与非序列化字段

news2024/11/27 0:45:23

在这里插入图片描述

在 Java 编程中,我们经常需要将对象序列化为字节流以便于存储或传输,或者将字节流反序列化为对象以恢复其状态。然而,并不是所有对象的所有属性都应该被序列化。有些属性可能包含敏感信息,或者它们只在内存中有意义。在这些情况下,我们可以使用 transient 关键字来标记属性,告诉 Java 序列化机制不要将其序列化。本文将深入介绍 transient 关键字的使用,让您完全掌握它的用法。

什么是 transient?

transient 是 Java 中的一个关键字,用于修饰类的成员变量。当一个成员变量被声明为 transient 时,它告诉 Java 虚拟机不要将其序列化。这意味着在将对象转换为字节流时,transient 修饰的成员变量将被忽略,不包含在序列化的数据中。

为什么使用 transient?

使用 transient 关键字有以下常见原因:

  1. 保护敏感信息:有些对象属性可能包含敏感信息,如密码、密钥等。通过将这些属性标记为 transient,可以确保它们在序列化过程中不被泄露。

  2. 临时状态:某些属性仅在对象的生命周期内具有意义,不需要在不同的运行时环境中保留它们的状态。将这些属性标记为 transient 可以减小序列化数据的大小,提高性能。

  3. 避免无限递归:在对象之间存在循环引用时,如果不使用 transient,Java 的默认序列化机制会导致无限递归序列化,最终导致堆栈溢出。通过标记其中一个引用为 transient,可以避免这个问题。

transient 的使用示例

让我们通过示例来了解如何使用 transient 关键字。

import java.io.*;

class Person implements Serializable {
    private String name;
    private transient String password;

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

    public String getName() {
        return name;
    }

    public String getPassword() {
        return password;
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", "secretpassword");

        // 将对象序列化到文件
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            oos.writeObject(person);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从文件中反序列化对象
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person deserializedPerson = (Person) ois.readObject();
            System.out.println("Name: " + deserializedPerson.getName());
            System.out.println("Password: " + deserializedPerson.getPassword());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们创建了一个 Person 类,其中包含 namepassword 属性。password 属性被标记为 transient,这意味着它不会被序列化到文件中。当我们将 person 对象序列化并反序列化后,尽管 name 属性被成功还原,但 password 属性的值将为 null,因为它没有被序列化。

注意事项

在使用 transient 关键字时,需要注意以下事项:

  1. 默认值:被 transient 关键字修饰的属性在反序列化后会被赋予默认值。对于基本数据类型,如 intboolean,默认值为对应类型的初始值(例如,0false)。对于引用类型,如 String,默认值为 null。因此,如果需要在反序列化后为 transient 属性赋予非默认值,需要自行在对象的构造函数或反序列化方法中处理。

  2. 版本兼容性:在使用 transient 关键字时,需要注意对象的版本兼容性。如果在对象的不同版本中添加或移除了 transient 属性,可能会导致反序列化时出现 InvalidClassException 异常。为了解决这个问题,可以使用 serialVersionUID 进行版本控制,确保序列化和反序列化的兼容性。

总结

transient 关键字允许我们在对象序列化过程中选择性地排除某些属性。这在保护敏感信息、优化性能和解决循环引用等方面非常有用。但在使用时需要小心,确保不会导致意外的行为。通过理解 transient 的工作原理和注意事项,您可以更好地控制对象的序列化过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日练习-7

目录 一、选择题 二、算法题 1、两种排序方法 2、求最小公倍数 一、选择题 1、 解析: 指针和引用是C中两种不同的变量类型,它们都可以用来访问或修改其他变量的值,但是它们有以下几个区别: 引用必须在定义时初始化&#xff0c…

Terminnal will be login out after 20 second

锐捷交换机,命令敲着敲着 ,就提示20秒后将中断 ,show ip ssh 查看也一下也没有什么特殊的。 于是查看了一下VTY下的配置 absolute-timeout 5 ,这句话是什么意思呢 ? 5分钟强制退出 ! 改进方法: (config)#…

为什么企业要选择使用报修工单管理系统?

报修管理系统是一种强大的工具,它为企业提供了一种方便、高效的方式来报告设备故障和异常情况,以便及时地反馈给相关的人员。这种系统不仅可以帮助企业更好地管理和跟踪设备的维护和维修工作情况,还可以对所有的维修信息进行统计和分析&#…

天视通等小众冷门摄像机接入安防监控系统EasyCVR平台的常见兼容问题及解决方法

众所周知,视频监控系统EasyCVR安防视频综合管理平台支持多类型设备、多协议方式接入,包括市场主流标准协议国标GB28181、RTMP、RTSP/Onvif协议等,以及厂家私有协议,如海康SDK、大华SDK、海康Ehome等。平台可兼容市面上绝大多数品牌…

【Java】类和对象知识

类和对象的基础知识 命名规则 类名统一使用大驼峰方法和成员变量统一使用小驼峰 定义一个类的时候注意的事项 1. 一般一个文件当中只定义一个类2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)3. public修饰的类必须…

英语——分享篇——每日100词——101-200

August——au我(谐音)gu姑(拼音)st沙滩(拼音)——八月份我和姑姑一起去沙滩 December——Dece第三(谐音)mb面包(拼音)er儿(拼音)——第三块面包是儿子在十二月买的

爬虫 — Scrapy-Redis

目录 一、背景1、数据库的发展历史2、NoSQL 和 SQL 数据库的比较 二、Redis1、特性2、作用3、应用场景4、用法5、安装及启动6、Redis 数据库简单使用7、Redis 常用五大数据类型7.1 Redis-String7.2 Redis-List (单值多value)7.3 Redis-Hash7.4 Redis-Set (不重复的)7.5 Redis-Z…

【python基础】—函数def()的定义与调用、参数、return返回值及变量作用域

文章目录 定义函数:def()语句调用函数:输入函数名和参数对应的值参数return 返回值变量作用域 定义函数:def()语句 语法: def 函数名(参数1,参数2,.....,参数n): 函数体 return 语句举例: def hello(name):print(n…

【MySQL系列】- MySQL自动备份详解

【MySQL系列】- MySQL自动备份详解 文章目录 【MySQL系列】- MySQL自动备份详解一、需求背景二、Windows mysql自动备份方法2.1 复制date文件夹备份实验备份环境创建bat直接备份脚本 2 .2 mysqldump备份成sql文件创建mysqldump备份脚本 2 .3 利用WinRAR对MySQL数据库进行定时备…

Android:报错“Transform‘s input file does not exist”

一、前言: android运行的时候出现如下错误:Transform output file C:\android\Enjoy\app\libs\xxxx.jar does not exist.刚开始我也很懵,我理解的事什么文件没有。上网查完资料,发现是添加依赖的时候有问题。 二、解决方案&…

Redis实战:Redis在Java中的基本使用

本片将介绍 Redis 在 Java 中的基本使用 文章目录 1、使用jedis操作redis1.1、Jedis简介1.2、引入jedis的Maven依赖1.2、获取连接1.3、使用实例 2、对于JedisPooled的使用2.1、使用JedisPooled2.2、关于连接池 3、SpringBoot下使用Redis3.1、引入Maven依赖3.2、配置Redis连接3.…

C语言入门log03

2023.9.19 周二 江苏 软件:visual studio 2017 ;注释快捷键 ctrlkc;取消ctrlku;运行快捷键 ctrlf5 B站视频 P4 按位取反~ int main() {//int arr[] {1,2,3,4,5,6};//4*624//printf("%d\n",sizeof(arr));//24 数组大小//print…

第14章 结构和其他数据形式

本章介绍以下内容: 关键字:struct、union、typedef 运算符:.、-> 什么是C结构,如何创建结构模板和结构变量 如何访问结构的成员,如何编写处理结构的函数 联合和指向函数的指针 设计程序时,最重要的步骤之…

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式? (设计模式是什么?优点有哪些?) 设计模式是一套经过验证的有效的软件开发指导思想/解决方案;提高代码的可重用性和可维护性;提高团…

DAQ高频量化平台:引领Ai高频量化交易模式变革

近年来,数字货币投资市场掀起了一股热潮,以(BTC)为代表的区块链技术带来了巨大的商业变革。数字资产的特点,如无国界、无阶级、无门槛、高流动性和高透明度,吸引了越来越多的人们的关注和认可,创…

linux内网渗透

一、信息收集 主机发现: nmap -sP 192.168.16.0/24 端口探测 masscan -p 1-65535 192.168.16.168 --rate1000 开放端口如下 nmap端口详细信息获取 nmap -sC -p 8888,3306,888,21,80 -A 192.168.16.168 -oA ddd4-port目录扫描 gobuster dir…

Windows安装GPU版本的pytorch详细教程

文章目录 chatGLM2-6B安装教程正式安装 chatGLM2-6B ChatGLM2-6B版本要装pytorch2.0,而且要2.0.1 ,因此CUDA不能用12.0 ,也不能用10.0,只能用11.x 版本。 安装教程 pip install直接下载安装 官网: https://pytorch.…

Python语言学习实战-内置函数all()和any()的使用(附源码和实现效果)

实现功能 all()和any()函数都是Python的内置函数,用于对布尔值进行操作。 all()函数接受一个可迭代对象作为参数,如果可迭代对象中所有元素都为真值(即非零、非空、非None等),则返回True,否则返回False。…

VR全景需要加盟吗?简述VR全景加盟的意义

对于一个刚开始了解VR全景行业的新人来说,VR全景不是有软件、有设备、会拍摄就行了吗?为什么还要找全景平台进行加盟呢?VR全景加盟的作用又是什么呢?那么,我们就不得不多问几个问题了,例如不加盟的话&#…

企业级数据仓库-理论知识

D3 AM 大数据中间件 Hive:将SQL转化成分布式Map/Reduce进行运算,也支持转换成Spark,需要单独安装Hive集群才能访问Spark,支持60%的SQL,延迟比较大。SparkSQL:属于Spark生态圈,Hive on Sqark。HBase: NoSQL,高并发读,适…