爪哇2博客
爪哇2博客

爪哇序列化中的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( 部门) {
        这个.部门 = 部门;
    }
}
 

Create SerializeMain.java 在 src->组织.arpit.javapostsforlearning
2. SerializeMain.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
 
组织.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();
  }
}
}
 

Create DeserializeMain.java 在 src->组织.arpit.javapostsforlearning
3.DeserializeMain.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
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,运行它

首先运行SerializeMain.java,然后运行DeserializeMain.java,您将获得以下输出:

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。

为什么需要serialversionuid?

实时地,您可能已经序列化了文件中的对象,并在不同的JVM上几个月后反序列化了它。在序列化和反序列化之间的类声明已更改。因此维护版本系统和serialversionid是一个好主意它执行完全相同的操作。它检查是否要反序列化序列化的同一对象。

最佳做法:

爪哇文档说:
“默认的serialVersionUID计算对类详细信息高度敏感,类详细信息可能会根据编译器的实现而有所不同,因此可能在反序列化期间导致意外的InvalidClassExceptions ”.
因此它说您必须声明serialVersionUID,因为它可以为我们提供更多控制权。在某些情况下,用于生成serialVersionUID的默认规则可能过于严格。例如,当字段的可见性更改时,serialVersionUID也会更改。或者有时您只想禁止对旧的序列化对象进行反序列化,则可以只更改serialVersionUID。
这样就够了吗?不是,您不仅必须声明它而且还要维护它。所以最重要的部分是维护serialVersionUID否则一切都会正常运行。当存储在其中的数据定义发生某些变化时,您应该更改serialVersionUID例如,字段的数据类型的类已更改。

分享这个

作者

关注作者

相关文章

  • 序列化面试问题
    2月14日

    爪哇序列化面试问答

    序列化是竞彩篮球分析中最重要的概念之一。如果您要面对核心竞彩篮球分析面试,那么可能会从序列化中询问您一些问题。 爪哇序列化教程:java中的序列化竞彩篮球分析序列化访谈问题和答案竞彩篮球分析序列化中的serialversionuid在竞彩篮球分析中可外部化竞彩篮球分析中的Transient关键字Serializable和Externalizable […]

  • 2月14日

    爪哇中可序列化和可外部化之间的区别

    在本教程中,我们将看到竞彩篮球分析中可序列化和可外部化接口之间的区别。 爪哇序列化教程:竞彩篮球分析的序列化竞彩篮球分析序列化访谈问答竞彩篮球分析的序列化竞彩篮球分析的序列化竞彩篮球分析的可外部化竞彩篮球分析的Transient关键字竞彩篮球分析的可序列化和可外部化之间的区别在理解差异之前,让我简要介绍一下Serializable […]

  • 19 May

    爪哇瞬时关键字与示例

    瞬态变量是其值在序列化过程中未序列化的变量。反序列化时,将获得这些变量的默认值。假设您有乡村课程而您没有’不想序列化总体属性,因为它会随着时间而变化,因此您可以将总体属性声明为瞬态,它会’t […]

  • 2月26日

    用竞彩篮球分析可外部化

    这是竞彩篮球分析序列化教程的第3部分竞彩篮球分析序列化教程:竞彩篮球分析中的序列化竞彩篮球分析序列化访谈问答竞彩篮球分析中的serialversionuid序列化java的externalizable 爪哇中的Transient关键字竞彩篮球分析中的Serializable和Externalizable之间的区别在理解Externalizable接口之前,您需要对序列化有所了解您可以在序列化[…]

  • 3月9日

    爪哇序列化

    这是竞彩篮球分析序列化教程的第1部分。 爪哇序列化教程:竞彩篮球分析的序列化竞彩篮球分析序列化访谈问答竞彩篮球分析的serialversionuid 爪哇的外部序列化竞彩篮球分析的Transient关键字竞彩篮球分析的Serializable和Externalizable之间的区别竞彩篮球分析提供了一种称为序列化的机制,以序列或字节序列形式持久化竞彩篮球分析对象[…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客