爪哇序列化中的serialVersionUID
爪哇序列化教程:
serialVersionUID用于确保在反序列化期间加载相同的类(在序列化期间使用的类)。serialVersionUID用于对象的版本控制。
如果您使用了序列化,则可能会看到serialVersionUID,因为每当实现Serializable接口时,IDE都会向您发出警告。
Serialversionuid语法:
根据java文档
1 2 3 |
任何-访问-修改器 静态的 最后 长 serialVersionUID = 42L; |
serialVersionUID必须为静态且为最终形式。您可以为其分配任何数字。
让我们来看一个例子:
Create 雇员.java 在 src->组织.arpit.javapostsforlearning
1,Employee.java
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 |
包 组织.Arpit.爪哇postsforlearning; 进口 爪哇.io.可序列化; 上市 类 雇员 实施 可序列化{ 私人的 静态的 最后 长 serialVersionUID = 1L; 整型 员工ID; 串 员工姓名; 串 部门; 上市 整型 getEmployeeId() { 返回 员工ID; } 上市 虚空 setEmployeeId(整型 员工ID) { 这个.员工ID = 员工ID; } 上市 串 getEmployeeName() { 返回 员工姓名; } 上市 虚空 setEmployeeName(串 员工姓名) { 这个.员工姓名 = 员工姓名; } 上市 串 getDepartment() { 返回 部门; } 上市 虚空 setDepartment(串 部门) { 这个.部门 = 部门; } } |
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 |
包 组织.Arpit.爪哇postsforlearning; 进口 爪哇.io.FileOutputStream; 进口 爪哇.io.IOException; 进口 爪哇.io.ObjectOutputStream; 上市 类 SerializeMain { / ** * @作者Arpit Mandliya */ 上市 静态的 虚空 主要(串[] args) { 雇员 emp = 新 雇员(); emp.setEmployeeId(101); emp.setEmployeeName(“阿尔伯特”); emp.setDepartment(“ CS”); 尝试 { FileOutputStream fileOut = 新 FileOutputStream(“ employee.ser”); ObjectOutputStream 外流 = 新 ObjectOutputStream(fileOut); 外流.writeObject(emp); 外流.关(); fileOut.关(); }抓住(IOException i) { i.printStackTrace(); } } } |
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 34 35 36 |
包 组织.Arpit.爪哇postsforlearning; 进口 爪哇.io.IOException; 进口 爪哇.io.ObjectInputStream; 上市 类 DeserializeMain { / ** * @作者Arpit Mandliya */ 上市 静态的 虚空 主要(串[] args) { 雇员 emp = 空值; 尝试 { FileInputStream fileIn =新 FileInputStream(“ employee.ser”); ObjectInputStream 在 = 新 ObjectInputStream(fileIn); emp = (雇员) 在 .readObject(); 在 .关(); fileIn.关(); }抓住(IOException i) { i.printStackTrace(); 返回; }抓住(ClassNotFoundException c) { 系统.出.打印(“未找到员工类别”); c.printStackTrace(); 返回; } 系统.出.打印(“反序列化的员工...”); 系统.出.打印(“ Emp ID:” + emp.getEmployeeId()); 系统.出.打印(“名称: ” + emp.getEmployeeName()); 系统.出.打印(“部门: ” + emp.getDepartment()); } } |
4,运行它
1 2 3 4 5 6 |
反序列化 雇员... Emp ID: 101 名称: Arpit 部门: CS |
因此,当您运行程序时,它已成功完成,并且employee.ser已在磁盘上创建。如果再次运行DeserializeMain.java,它将再次成功运行。现在将变量serial的值更改为
1 2 3 |
私人的 静态的 最后 长 serialVersionUID = 2L; |
如果您现在运行DeserializeMain.java,它将出现以下错误。
1 2 3 |
爪哇.io.InvalidClassException: 组织.Arpit.爪哇postsforlearning.雇员; 本地 类 不相容: 流 类desc serialVersionUID = 1, 本地 类 serialVersionUID = 2 |
因此,在反序列化过程中,我们遇到了错误。它抱怨Serialvesionuid被更改。但是它怎么知道?因为serialversionuid是一个静态变量,我们知道“我们不能序列化静态变量”它如何存储serialversionuid?是的,有异常。尽管serialversionuid是静态的,但它会被序列化。因此,ObjectOutputStream每次都会写入输出流,而ObjectInputStream会回读它,如果它的值与当前版本的类不相同,则会抛出InvalidClassException。