serialVersionUID 实际的作用

SOC Boot学习(二)——JTAG Debug介绍 JTAG(Joint Test Action Group ,联合测试行动小组 ) 是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试。JTAG 技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路 TAP ( Test Access Port ,测试访问口),通过专用的 JTAG 测试工具对内部节点进行测试。如今大多数比较复杂的器件都支持 JTAG 协议,如 ARM 、 DSP 、 FPGA 器件等。 阅读详情

serialVersionUID 实际作用

JAVA 中对序列化的支持 都是需要实现 Serializable 接口,然后需要声明一个serialVersionUID (也可以不用申明).
serialVersionUID 的作用是什么呢?
JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化

serialVersionUID 申明方式

  • 显示声明
public class User implements Serializable {

    private static final long serialVersionUID = -3350966179389669783L;
    private String name;

显示申明是根据类名 字段 参数 生成的一个64位的hash值(申明之后就不会变了 就算修改了类信息)

  • 隐式申明
public class User implements Serializable {
   private String name;

隐式申明 也是会根据类名 字段 参数 生成的一个64位的hash值(但是每次类信息修改 都会重新生成)

类字段新增与sid声明方式

  • 新增字段&sid 隐式申明

声明 User 类 (不申明serialVersionUID)持久化到文件, 在User 类中新增字段 在从文件读取

申明User类
public class User implements Serializable {

    private String name;

    private int age;
写入序列化文件
    private static final String FILE = "/Users/xxx/Desktop/dto";

    @Test
    public void serialize() {
        User user = new User();
        user.setName("sunla");
        user.setAge(31);

        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(bos);

            os.writeObject(user);
            os.close();
            bos.close();
            FileUtils.writeByteArrayToFile(new File(FILE),bos.toByteArray());
        } catch (IOException e) {
            throw new IllegalArgumentException("Non-serializable object", e);
        }
    }
user类新增字段
public class User implements Serializable {

    private String name;

    private int age;
    /** 新增属性 */
    private HashSet<String> sets = new HashSet<>();
执行从文件反序列化操作
	private static final String FILE = "/Users/xxx/Desktop/dto";
    @Test
    public void deserialize() {
        Object rv = null;
        try {
            byte[] in = FileUtils.readFileToByteArray(new File(FILE));
            if (in != null) {
                ByteArrayInputStream bis = new ByteArrayInputStream(in);
                ObjectInputStream is = new ObjectInputStream(bis);

                rv = is.readObject();
                is.close();
                bis.close();
            }
            User user = (User)rv;
            System.out.println(JSON.toJSONString(user));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
执行的结果
java.io.InvalidClassException: com.test.serial.User; local class incompatible: stream classdesc serialVersionUID = 7212634958119174257, local class serialVersionUID = 5030622290002077224

	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1880)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1746)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2037)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)

执行结果报错了,2个很明显的 serialVersionUID 不一样 导致反序列化失败,就是前面说到的 隐式声明的sid 当新增字段后会变更

  • 新增字段 & sid 显示申明

声明 User 类 (申明serialVersionUID)持久化到文件, 在User 类中新增字段 在从文件读取

申明User类
public class User implements Serializable {

    private static final long serialVersionUID = -3350966179389669783L;

    private String name;

    private int age;
写入序列化文件
    private static final String FILE = "/Users/xxx/Desktop/dto";

    @Test
    public void serialize() {
        User user = new User();
        user.setName("sunla");
        user.setAge(31);

        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(bos);

            os.writeObject(user);
            os.close();
            bos.close();
            FileUtils.writeByteArrayToFile(new File(FILE),bos.toByteArray());
        } catch (IOException e) {
            throw new IllegalArgumentException("Non-serializable object", e);
        }
    }
user类新增字段
public class User implements Serializable {

    private static final long serialVersionUID = -3350966179389669783L;

    private String name;

    private int age;
    /** 新增属性(这里使用了集合 反序列化出来大家可以猜下 调用getSets的结果) */
    private HashSet<String> sets = new HashSet<>();
执行从文件反序列化操作
	private static final String FILE = "/Users/xxx/Desktop/dto";
    @Test
    public void deserialize() {
        Object rv = null;
        try {
            byte[] in = FileUtils.readFileToByteArray(new File(FILE));
            if (in != null) {
                ByteArrayInputStream bis = new ByteArrayInputStream(in);
                ObjectInputStream is = new ObjectInputStream(bis);

                rv = is.readObject();
                is.close();
                bis.close();
            }
            User user = (User)rv;
            System.out.println(JSON.toJSONString(user));
            System.out.println(user.getSets() == null ? "set null":"set not null");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
执行的结果
{"age":31,"name":"sunla"}
set null

执行结果 是新增的集合对象是个null ,其他字段完整映射

从基础知识到PCB设计,打造全能硬件工程师 成为一名出色的硬件工程师需要在多个领域建立坚实的基础。从硬件基础知识、元器件学习、模拟电子电路到PCB设计,以及数字电子电路与通信,每个方面都是构建全面硬件工程师技能集的重要组成部分。通过深入学习和实践这些领域,你将能够在硬件工程领域中取得更多的成就。 阅读详情

相关推荐

机器学习——笔记整理(原理、python代码)——反反复复,出精活!

回顾知识,检查自我,开拓新域。 机器学习1.监督学习 机器学习简介: 机器学习是实现人工智能的手段,其主要研究内容是如何利用数据或经验进行学习,改善具体算法的性能。 多领域交叉,涉及概率论、统计学,算法复杂度理论等多门学科 广泛应用于网络搜索、垃圾邮件过滤、推荐系统、广告投放、信用评价、欺诈检测、股票交易和医疗诊断等应用。 机器学习分类: 机器学习一般分为下面几种类别 监督学习 ( Supervised Learning) 无监督学习 ( Unsupervised Learning) 强化学习(

weixin_45666566的博客 6486

【Java 基础篇】serialVersionUID 详解

是 Java 序列化机制中的一个字段,用于标识类的版本。当一个类实现了接口(表示该类可以被序列化),编译器会自动生成一个字段,用于表示类的版本号。是一个长整型数值,通常是一个正整数,可以手动指定,也可以由编译器自动生成。该字段的主要作用是用于在反序列化时检查类的版本是否与序列化时的版本一致,以确保反序列化的对象与序列化时的对象是兼容的。当使用进行版本控制时,通常需要考虑以下情况:当类的版本发生变化时,如何确保反序列化仍然能够成功。以下是一个示例,演示了如何使用处理不同版本类的序列化和反序列化。

繁依Fanyi的博客 1万+

机器人关节电机发热难题:从工程化角度拆解热管理解决方案(下)

摘要:本文系统分析了机器人关节电机与驱动系统的热管理方案,重点解决局部热点问题。针对不同功率场景提出了热管/均热板散热(适用于中小功率)和液冷散热(适用于高功率)的具体实施方案,详细比较了结构参数、材料选择、安装工艺和散热效果。特别强调了电机-驱动协同热管理的重要性,提出"工况联动+热路径共享"的核心理念,包括一体化散热结构设计和动态控制策略。最后介绍了热仿真与测试验证方法,确保方案的有效落地。通过系统级热管理,可显著降低温升(热点区域降温30-60℃),同时优化体积和能耗。

bother3000的博客 3329

什么是serialVersionUID?serialVersionUID详解

在阅读很多开源项目中在很多类中都会发现存在一个使用static final 修饰的量,通常很大而且和代码似乎没有什么规律。 比如下面的代码: public class Dml implements Serializable { private static final long erialVersionUID = 2611556444074013268L; (代码来自阿里巴巴开源项目Client Adapter) 概述 所述的serialVersionUID属性是用来序列的标识符/反序列化的对象

北鹤M的代码手账 4万+

告别Godot默认编辑器:手把手教你用VSCode配置C#开发环境(附中文注释避坑指南)

本文详细介绍了如何将VSCode配置为Godot引擎的C#开发环境,提升游戏开发效率。从环境准备、扩展配置到解决中文编码问题,提供完整的避坑指南和高级调试技巧,帮助开发者充分利用VSCode的智能补全和调试功能,打造高效工作流。

weixin_30596023的博客 189

NFT图片批量合成及稀有度计算工具

一、制作背景 -当前NFT作品制作的大多方式都是使用部件拼接的形式,然后从大量的可能性结果取优; 二、解决问题 拼接合成的组合数量十分巨大,手工合成费时费力; 合成中对各个部件的使用次数不容易控制,部位出现的概率对作品的稀有度及评分影响较大; 对于生成的作品各个部位的信息(包括来源和使用率)统计繁琐,不利于对作品的介绍中体现; 三、程序功能介绍 1、功能自定义部位稀有度批量合成NFT作品 步骤一:创建各个合成部件文件夹,将图片放到文件夹内 步骤二:软件上设置各个部件对于的图片文件夹及出现的概率 步骤二

Keeping111的博客 4638

理解serialVersionUID是什么?有什么用?如何生成?

1、什么是serialVersionUID? serialVersionUID用作Serializable类中的版本控件。如果您没有显式声明serialVersionUID,JVM将根据您的Serializable类的各个方面自动为您执行此操作,如[Java(TM)对象序列化规范中所述](http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html)。 2、SerialVersionUID示例 3、相同的serialVe

Java搜索工程技术栈 3万+

【局部规划模块曲线算法】曲线平滑介绍

本文先对轨迹平滑问题做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容(1)适合给移动机器人运动的路径【满足运动学,高阶平滑】(2)高阶的运动学不能够突变的【至少三阶的加速度不能突变,最好四阶的jerk和五阶的snap也不能突变】(3)在转弯的地方不会停下来(4)加减速均衡,节省能量(5)节省时间的。

qq_35635374的博客 5715

serialversionuid的作用

当我们在使用java编程的时候,肯定会使用到serialversionuid,但很多情况下并不知道serialversionuid的作用是什么,其实它就是一种语言序列化的机制。 serialversionuid的作用:答:serialversionuid的作用是验证版本一致性。如果serialversionuid一致,说明他们的版本是一样的。反之,就说明版本不同,就无法运行或使用相关功能。 1、serialversionuid是java中的一种序列化机制。2、当我们进行序列化操作时,会把当前的版本写入到文

i_am_xiaobai的博客 1万+

【SpringBoot 4.x 第29节】Spring Security 7 入门:先理解认证和授权!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 551

vue2 - 详细实现播放AMR格式音频并实现自定义播放器样式,支持amr音频文件在线地址URL播放、调用服务端API接口获取二进制文件流amr形式、用户本地上传amr文件并实现立即播放(详细代码)

vue2,amr,amr文件播放,vue播放amr音频文件以及在线url跨域问题解决,vue使用audio标签播放amr音频,amr跨域解决,amr网页解码播放,文件上传后怎么播放,vue2播放.amr语音文件,api接口形式调用获取的amr如何播放,vue中如何使用audio元素播放AMR格式的文件,进度条,vue前端如何播放AMR格式的音频文件,vue播放语音文件AMR格式,播放amr格式音频AMR录音机,h5原生audio播放amr格式的音频,VUE2使用benz-amr-recorder 实现解码、

✅ 精选推荐文章 7414

深入解析serialVersionUID原理及其使用场景

序列化(Serialization)是将对象转换为字节流的过程,以便将其存储到文件、内存中进行传输或在网络中进行传输。反序列化(Deserialization)则是将字节流转换回对象的过程,以便恢复对象的状态和数据。序列化和反序列化的主要目的是在不同的计算机环境或进程之间传递对象,并且保持对象的完整性和一致性。它们在以下情况下非常有用:持久化对象:将对象保存到磁盘或数据库中,以便后续使用。远程通信:通过网络传输对象,例如在客户端和服务器之间传递数据。对象复制:通过序列化和反序列化创建对象的副本。

qq_51634677的博客 4649

第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)

本文详细介绍了TMC2240电机驱动芯片的正反转实现方法,重点解决方向切换时的抖动和冲击问题。文章首先明确了硬件连接、基础配置和使能状态三个前提条件,然后阐述了DIR引脚电平控制方向的核心原理,提供了STM32的GPIO配置代码。针对方向切换时的电流冲击问题,作者提出了"停止-延迟-切换-启动"的平滑切换逻辑,并给出了包含方向枚举、转速控制和方向切换函数的完整代码实现方案。通过这种优化方法,可以有效避免电机在正反转切换时产生的抖动、冲击声和发热问题,实现稳定的双向控制。文章还提示了后续可

BackCatK Chen的博客 2074

Java中serialVersionUID的作用

是Java序列化机制中的一个版本标识符,用来确保序列化对象的版本一致性。// 类的成员变量和方法 private String name;} // 省略getter和setter方法 }// 类的成员变量和方法// 省略getter和setter方法。

技术研究中心 550

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java类中serialVersionUID的作用

java类中serialVersionUID的作用

蔚蓝海域的博客 257

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

serialVersionUID的作用

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。Eclipse中The serializable class XXXXXX does ...

weixin_34399060的博客 70

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

serialVersionUID作用

 serialVersionUID作用 Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。  Eclipse中

shenxiuwen1989的专栏 335

private static final long serialVersionUID = 1L

很显然这行代码的意思是将SerialVersionUID的值定义为一个常量,那这是干什么的呢? 解决这个问题,首先要了解包含SerialVersionUID的Serializable接口是什么? Serializable:一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。

early_day的博客 4272

Java技术:serialVersionUID作用介绍

serialVersionUID概念介绍英文翻译的意思是序列化版本号。凡是实现Serializable接口的类都会有一个表示序列化版本标识符的静态变量。se...

IT技术分享社区 745

serialVersionUID

为什么80%的码农都做不了架构师?>>> ...

weixin_34297704的博客 66

serialVersionUID 的用途及未定义的影响:深入探讨与实际应用

作为一名编程博客专家,我将带领大家深入探讨的用途及其在 Java 序列化中的重要性。本文将详细解释的含义、用途以及未定义可能带来的问题。通过丰富的代码示例、代码注释和技术解释,帮助程序员全面理解的工作原理及实际应用。如果类没有定义,JVM 会在运行时自动生成一个。然而,自动生成的通过本文的讲解,我们详细了解了的用途及其在 Java 序列化中的重要性。用于标识类的版本,确保序列化数据与当前类的版本兼容。未定义可能会导致版本不兼容和运行时错误。在实际编程中,定义。

xycxycooo的博客 945

Understand The SerialVersionUID

转自:http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/

595

【101期】Java 中 serialVersionUID 的作用是什么?举例说明!

点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方留言必回,有问必答!每天08:08更新文章,每天进步一点点...serialVersionUID适用于Ja...

Java精选 396

java类继承Serializable后生成serialVersionUID产生的奇怪问题(转)

  当一个java类继承Serializable后,一般编辑器会提示你生成一个serialVersionUID,在eclipse下可以自动生成一个随机的uid,乍一看生成后一切OK,运行良好,eclipse也不再出现警告,皆大欢喜。 后来网站出现了一个很奇怪的问题,struts架构下的网站经常出现javax.servlet.ServletException: BeanUtils.populat...

u022731189的博客 2963

Java序列化的作用serialVersionUID

serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastEx

xiaolongonly的博客 439

private static final long serialVersionUID = 1L;详解

private static final long serialVersionUID = 1L; ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33...

weixin_30908707的博客 174
上一篇: 定义可装配的流程编排器
下一篇: 快速校验非法字符工具
sunla198910
博客等级 码龄17年 8粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值