Java中序列化与反序列化(五)——static字段

static字段

  • 1、概述
  • 2、静态字段的特性
    • 2.1、与类相关联
    • 2.2、唯一副本
    • 2.3、通过类名访问
    • 2.4、生命周期
  • 3、静态字段不被序列化
  • 4、一个疑问
    • 4.1、作用
    • 4.2、使用
    • 4.2、为什么serialVersionUID是静态的
    • 4.2、为什么serialVersionUID会被“序列化”
  • 5、总结

大家好,我是欧阳方超,可以扫描下方二维码关注我的公众号“欧阳方超”,后续内容将在公众号首发。
在这里插入图片描述

1、概述

静态字段(static)不会被序列化。静态字段属于类本身,而不是某个实例。
在Java中,静态字段(static fields)是与类本身相关联的,而不是与类的任何特定实例相关联。这意味着静态字段在类加载时初始化,并且在整个应用程序的生命周期内保持一个唯一的副本。

2、静态字段的特性

2.1、与类相关联

静态字段是在类加载时初始化的,而不是在实例化对象时初始化的。它们属于类本身,而不是类的任何一个实例。因此,所有该类的实例共享同一个静态字段。

2.2、唯一副本

无论创建多少个类的实例,静态字段在内存中都只有一个副本。所有实例都共享这个唯一的副本。

2.3、通过类名访问

静态字段可以通过类名直接访问,而不需要创建类的实例。

2.4、生命周期

静态字段的生命周期与类的生命周期一致。在类加载时初始化,在类卸载时销毁。

3、静态字段不被序列化

序列化是将对象的状态转换为字节流的过程,方便将对象保存到文件中获通过网络传输。由于静态字段与类相关联,而不是与类的实例关联,因此在序列化对象时,静态字段的值不会被包含在序列化的字节流中。换言之,静态字段是类级别的状态,而序列化只保存实例级别的状态。下面用一个实例来演示静态字段不被序列化。

import java.io.*;

class MyClass implements Serializable {
    public static int staticField = 100;
    public int instanceField;

    public MyClass(int instanceField) {
        this.instanceField = instanceField;
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass(200);

        try {
            //
            FileOutputStream fileOutputStream = new FileOutputStream("C:\\object.ser");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(myClass);
            objectOutputStream.close();
            fileOutputStream.close();

            MyClass.staticField = 400;

            FileInputStream fileInputStream = new FileInputStream("C:\\object.ser");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            MyClass deserializedObj = (MyClass)objectInputStream.readObject();
            objectInputStream.close();
            fileInputStream.close();

            // 输出反序列化对象的字段值
            System.out.println("Static Field: " + MyClass.staticField); // 输出 400
            System.out.println("Instance Field: " + deserializedObj.instanceField); // 输出 200

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

示例中,首先对MyClass类进行实例化得到obj对象,并将obj对象进行序列化,然后将其保存到磁盘中;接着对静态字段staticField进行修改;然后对磁盘中保存的文件进行反序列化,以得到MyClass类的对象,打印staticField属性,发现是修改后的值。说明静态字段不会被序列化。

4、一个疑问

serialVersionUID不是被 static 变量修饰了吗?它会被“序列化”吗?
serialVersionUID确实是一个用static修饰的字段,但它并不是被序列化的对象的一部分。它的作用和其他静态字段不同,主要用于控制序列化和反序列化的过程。

4.1、作用

serialVersionUID是Java序列化机制中的一个版本控制标识符。它用于验证在序列化和反序列化过程中,发送端和接收端的类是否兼容。如果类的serialVersionUID不匹配,反序列化会失败并抛出InvalidClassException。

4.2、使用

在实现Serializable接口的类中,可以显式地声明serialVersionUID,例如:

public class MyClass implements Serializable {
    private static final long serialVersionUID = 1L;
    private int instanceField;

    public MyClass(int instanceField) {
        this.instanceField = instanceField;
    }
}

如果没有显式声明serialVersionUID,Java编译器会根据类的结构自动生成一个serialVersionUID。然后,自动生成的serialVersionUID是基于类的结构(包括字段、方法等),因此如果类的结构发生变化,自动生成的serialVersionUID也会变化,导致反序列化失败。

4.2、为什么serialVersionUID是静态的

serialVersionUID被声明为static是因为它与类本身相关联,而不是与类的实例相关联。它用于在类的版本之间进行一致性检查,而不需要保存在每个序列化的对象中。

4.2、为什么serialVersionUID会被“序列化”

实际上,serialVersionUID并不会被序列化。它的作用是在序列化和反序列化过程中进行版本控制。
序列化时:Java序列化机制会将类的serialVersionUID写入序列化的字节流中。
反序列化时:Java序列化机制会读取字节流中的serialVersionUID,并将其与当前类的serialVersionUID进行比较。如果匹配,则反序列化成功;如果不匹配,则抛出InvalidClassException。

5、总结

静态字段在Java中属于类本身,而不是类的实例。在序列化过程中,静态字段的值不会被包含在序列化的字节流中,因为它们是类级别的状态,而序列化只保存实例级别的状态。这是因为静态字段在内存中只有一个副本,并且与类的生命周期一致。serialVersionUID是一个静态字段,用于控制Java序列化和反序列化过程中的版本一致性检查。虽然它是静态的,但它并不会被序列化到字节流中,而是用于在序列化和反序列化过程中进行版本控制,以确保类的兼容性。

我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典文献阅读之--OrienterNet(自动驾驶中基于网格的交通场景感知)

dia 0. 简介 使用神经网络来匹配2D公开地图的做法是一个很有趣的方法,人们可以使用简单的2D地图在3D环境中指明自己所处的位置,而大部分视觉定位算法则依赖于昂贵的、难以构建和维护的3D点云地图。为了弥合这一差距《OrienterNet: Visual Localization…

项目计划

1.什么是项目计划? 2.软件项目计划的作用 3.项目计划的内容 4.项目计划的主要内容 5.滚动计划方法 6.WBS方法 7.软件项目的特点 8.制定计划的要点 9.直接成本和间接成本 10.为什么说项目计划不是一个文档,而是一个持续的策划过程? 项目计划不…

MySQL数据库回顾(1)

数据库相关概念 关系型数据库 概念: 建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 1.使用表存储数据,格式统一,便于维护 2.使用SQL语言操作,标准统一,使用方便 SOL SQL通用语法 …

极速查询:StarRocks 存算分离 Compaction 原理 调优指南

作者:丁凯,StarRocks TSC member/镜舟科技云原生技术负责人 StarRocks 在数据摄入过程中,每次操作都会创建一个新的数据版本。在查询时,为了得到准确的结果,必须将所有版本合并。然而,随着历史数据版本的累…

【自记录】记一台i7四代老爷笔记本重装Win10 22H2

1 背景 手上有一台退役的老爷笔记本,清华同方锋锐 U430。因为比较轻便,最近重新翻出来用于临时抓个包和简单的脚本语言(比方说Python)编辑工作。但是现在像VSCode的新版本都要求Win10以上,像Continue这类的AI插件都跑…

【语义分割软件系统】基于Deeplabv3+的河岸线分割软件

基于Deeplabv3的河岸线分割软件 本章内容参考文章《基于Deeplabv3城市街道分割算法》。数据集使用的是USVInland河岸线分割数据集,如图1所示。USVInland数据集是首个针对内陆水道无人水面船只的多传感器数据集,这个数据集由欧卡智舶联合清华大学与西北工…

ChromeOS 逐渐靠近安卓

ChromeOS 逐渐 “安卓化” 谷歌在博客中透露,将在ChromeOS底层更广泛地使用和Android相同的技术栈。一个具体的例子是,ChromeOS现在已经开始使用Android的蓝牙协议栈,取代了之前使用的自己的协议栈。这次改变不仅提高了蓝牙配对速度&#xf…

css之元素类型

元素类型 块状元素 block 特点 独占一行或一块区域&#xff0c;竖着排列可以添加宽高可以设置margin和padding值&#xff0c;上下左右都生效可以作为其他元素的父元素 代表性标签 <div> ...</div> <p> ... </p> <h2> ... </h2> &l…

MAGs培养有线索了?宏组学中未培养微生物表型与培养条件预测

宏基因组测序技术让人们对地球上微生物的多样性有了更深入的了解&#xff0c;但分离培养是研究微生物的生理代谢功能并解析其生态作用的关键。2023年11月的世界微生物数据中心&#xff08;WDCM&#xff09;年会中&#xff0c;全面启动了全球“未培养微生物培养组”计划&#xf…

Nuxt快速学习开发 -- Nuxt3配置

Nuxt配置 nuxt.config.ts文件位于 Nuxt 项目的根目录下&#xff0c;可以覆盖或扩展应用程序的行为 使用可组合项&#xff0c;这些变量会暴露给应用程序 //nuxt.config.ts import { fileURLToPath } from "url"; ​ export default defineNuxtConfig({alias: {//配置…

京东618 :AI总裁数字人、京东Apple Vision Pro版亮相

2004年6月18日&#xff0c;刚刚转型电商才半年的京东&#xff0c;用最互联网的方式为忠实粉丝打造了一场价格降到“难以置信”的店庆促销活动&#xff0c;这场促销活动还有一个很具有当年网络小说特质的名字——“月黑风高”。 2024年京东618&#xff0c;早已成为一场亿万消费…

若依4.7.8版本计划任务rce复现

0x00 背景 最近项目中发现很多单位都使用了若依二开的系统&#xff0c;而最近若依有个后台计划任务rce的漏洞&#xff0c;比较新&#xff0c;我还没复现过&#xff0c;于是本地搭建一个若依环境复现一下这个漏洞。 这个漏洞在4.7.8版本及之前都存在&#xff0c;现在最新版的若…

【每日刷题】Day68

【每日刷题】Day68 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 451. 根据字符出现频率排序 - 力扣&#xff08;LeetCode&#xff09; 2. 最小的K个数_牛客题霸_牛客…

【AI绘画】新手小白看这篇就够啦!国产PS AI插件超好入门!

随着人工智能技术的飞速发展&#xff0c;Photoshop作为设计师们不可或缺的工具&#xff0c;也在不断地融入AI技术&#xff0c;以提升设计效率和效果。最近米兔用了一款AI绘画软件StartAI&#xff0c;被其强大的功能和易用性经验到了&#xff0c;下面跟大家详细分享一下这款ps插…

建筑工地通常那种考勤机好用?

建筑工地通常那种考勤机好用&#xff1f; 大量从乡村前往城市的务工者&#xff0c;所从事的多为建筑工程类行业&#xff0c;此种行业对学历与技能的要求不高&#xff0c;而工资水平倒也尚可&#xff0c;正因如此才吸引了众多劳动者。那要怎样管好工地上的项目呢&#xff1f;首要…

PTrade量化策略API说明—PTrade如何获取分时成交行情:get_tick_direction

get_tick_direction – 获取分时成交行情 get_tick_direction(symbolsNone, query_date0, start_pos0, search_direction1, data_count50) 使用场景 该函数在交易模块可用 接口说明 该接口用于获取当日分时成交行情数据。 注意事项&#xff1a; 1、沪深市场都有分时成交数…

移植案例与原理 - utils子系统之KV存储部件 (3)

5、KV存储部件对应UtilsFile接口部分的代码 分析下KV存储部件对应UtilsFile接口部分的代码。我们知道对外接口有设置键值UtilsSetValue、获取键值UtilsGetValue、删除键值UtilsDeleteValue和清除缓存ClearKVCache。我们先看看内部接口&#xff0c;这些接口调用的全部是UtilsFi…

对SpringBoot入门案例的关键点

我们SpringBoot的入门案例中&#xff0c;即做了两个重要工作&#xff1a; 配置pom.xml文件写启动类 1.pom.xml依赖配置文件 ①帮助我们进行版本控制的父模块 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

高危CNVD|用友-U8-OA基础版存在文件上传漏洞getshell

漏洞描述 用友U8-OA基础版存在任意文件覆盖写入漏洞 漏洞说明&#xff1a;用友U8-OA基础版因为代码问题&#xff0c;存在任意文件覆盖写入漏洞&#xff0c;可以覆盖写入系统中存在的文件&#xff0c;可getshell。FOFA指纹: body"致远" && "/yyoa/&quo…

day03 子查询分页存储过程

目录 子查询 介绍&#xff1a; 子查询规范 子查询分类 模糊查询 注意事项和技巧 分页查询 作用&#xff1a; LIMIT关键字使用 指定初始位置 不指定初始位置 分页 视图 介绍&#xff1a; 优点 创建视图 嵌套视图 删除视图 修改视图 更新视图 存储过程 介绍…