java的序列化注解Serial、序列化版本号serialVersionUID、eclipse中自动生成serialVersionUID |
您所在的位置:网站首页 › 反序列化报错可能是因为什么 › java的序列化注解Serial、序列化版本号serialVersionUID、eclipse中自动生成serialVersionUID |
说明
例如,jdk源码NTLMException类的定义,其中涉及到了序列化注解Serial和序列化版本号字段serialVersionUID: 序列化注解java.io.Serial是在javaSE-14版本引入的。通常注解实现了序列化类的序列化相关的函数和字段,这样可以让编译器在编译的时候检查序列化相关的函数、字段的声明,提前发现错误。 5个序列化相关的方法: 这个版本号的作用是反序列化的时候检查,检查序列化对象的接收者和发送者是否使用了相同的版本号,如果版本号不同,会导致出现 InvalidClassException异常。 如果在程序中没有明确定义这个字段,那么程序在序列化的时候会自动生成;如果程序中明确了定义这个字段,那么就使用定义的这个版本号。 强烈建议在程序中明确定义。因为如果自动生成这个字段,会依赖序列化类的很多方面,对类的细节敏感,而类的细节可能因为编译器实现而变化。 如果明确定义,这个字段名称为serialVersionUID,类型是long,用static, final修饰。另外,强烈建议加上private修饰。因为如果用private修饰,那么serialVersionUID仅对当前类有效,不能被子类继承。 有公司的编程规范就要求:序列化类新增属性时,不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么要修改 serialVersionUID 值。 在eclipse中自动生成serialVersionUID的方法 示例描述serialVersionUID可以手工写个值,没有问题。我们看别人代码的时候,有时候看到值是1L,有时候是一个很大的负的整数。尤其这个负的很大的整数,很好奇是怎么来的。 在eclipse中可以自动生成serialVersionUID,有两种选择方式。我们用一个示例讲解下过程。 例如,定义Demo1这个类,声明实现了Serializable接口,但还没有手工添加serialVersionUID字段,在类的左侧出现了黄色的提醒符号,这个是编译器的提醒,告诉我们代码不完善,需要修复: 鼠标放在左侧的黄色提醒符号上,有提醒,说没有声明serialVersionUID这个字段: 在黄色提醒符号上点击鼠标右键,出现上下文菜单: 单击上下文菜单中的Quick Fix,出现了两种生成serialVersionUID的方法: 第一行: 第二行: 这个表示生成一个默认的serialVersionUID,用户可以自定义值。如果类自从首次发布以后确实经历了结构的变化,选这种生成方法。 在第一种选择上双击鼠标,生成的serialVersionUID如下所示(生成后,自己想修改为其它的值也可以,例如2L): 这个是Java编译器生成一个serialVersionUID。如果类自从首次发布以后没有经历结构的变化,选这种生成方法。 在第二种选择上双击鼠标,生成的serialVersionUID如下所示(这个生成后就不建议手工修改了): |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |