java的序列化注解Serial、序列化版本号serialVersionUID、eclipse中自动生成serialVersionUID
java的序列化注解Serial、序列化版本号serialVersionUID、eclipse中自动生成serialVersionUID
说明
例如,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如下所示(这个生成后就不建议手工修改了):
更多推荐
所有评论(0)