java的序列化注解Serial、序列化版本号serialVersionUID、eclipse中自动生成serialVersionUID

您所在的位置:网站首页 反序列化报错可能是因为什么 java的序列化注解Serial、序列化版本号serialVersionUID、eclipse中自动生成serialVersionUID

java的序列化注解Serial、序列化版本号serialVersionUID、eclipse中自动生成serialVersionUID

2024-07-07 05:07| 来源: 网络整理| 查看: 265

说明

例如,jdk源码NTLMException类的定义,其中涉及到了序列化注解Serial和序列化版本号字段serialVersionUID: 在这里插入图片描述

序列化注解java.io.Serial

序列化注解java.io.Serial是在javaSE-14版本引入的。通常注解实现了序列化类的序列化相关的函数和字段,这样可以让编译器在编译的时候检查序列化相关的函数、字段的声明,提前发现错误。 5个序列化相关的方法: 在这里插入图片描述 2个序列化相关的字段: 在这里插入图片描述

序列版本号字段serialVersionUID

这个版本号的作用是反序列化的时候检查,检查序列化对象的接收者和发送者是否使用了相同的版本号,如果版本号不同,会导致出现 InvalidClassException异常。 如果在程序中没有明确定义这个字段,那么程序在序列化的时候会自动生成;如果程序中明确了定义这个字段,那么就使用定义的这个版本号。 强烈建议在程序中明确定义。因为如果自动生成这个字段,会依赖序列化类的很多方面,对类的细节敏感,而类的细节可能因为编译器实现而变化。 如果明确定义,这个字段名称为serialVersionUID,类型是long,用static, final修饰。另外,强烈建议加上private修饰。因为如果用private修饰,那么serialVersionUID仅对当前类有效,不能被子类继承。 有公司的编程规范就要求:序列化类新增属性时,不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么要修改 serialVersionUID 值。

在eclipse中自动生成serialVersionUID的方法 示例描述

serialVersionUID可以手工写个值,没有问题。我们看别人代码的时候,有时候看到值是1L,有时候是一个很大的负的整数。尤其这个负的很大的整数,很好奇是怎么来的。 在eclipse中可以自动生成serialVersionUID,有两种选择方式。我们用一个示例讲解下过程。

例如,定义Demo1这个类,声明实现了Serializable接口,但还没有手工添加serialVersionUID字段,在类的左侧出现了黄色的提醒符号,这个是编译器的提醒,告诉我们代码不完善,需要修复: 在这里插入图片描述

鼠标放在左侧的黄色提醒符号上,有提醒,说没有声明serialVersionUID这个字段: 在这里插入图片描述

在黄色提醒符号上点击鼠标右键,出现上下文菜单: 在这里插入图片描述

单击上下文菜单中的Quick Fix,出现了两种生成serialVersionUID的方法: 第一行:

在这里插入图片描述

第二行: 在这里插入图片描述

第一种:Add default serial version ID

这个表示生成一个默认的serialVersionUID,用户可以自定义值。如果类自从首次发布以后确实经历了结构的变化,选这种生成方法。 在第一种选择上双击鼠标,生成的serialVersionUID如下所示(生成后,自己想修改为其它的值也可以,例如2L): 在这里插入图片描述

第二种:Add generated serial version ID

这个是Java编译器生成一个serialVersionUID。如果类自从首次发布以后没有经历结构的变化,选这种生成方法。 在第二种选择上双击鼠标,生成的serialVersionUID如下所示(这个生成后就不建议手工修改了): 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3