为什么Java不强制执行serialVersionUID

Abh*_*Ash 0 java

serialVersionUID在我看来有一个非常宽松的规范.开发具有可序列化接口的类的任何主体都可以使用InvalidClassException来烧伤他的手.另外,我看到一个使用int作为数据类型而不是长的开发者.

所以,我的问题是为什么Java设计人员和开发人员没有做更具体的事情,就像我们实现可序列化时一样,我们必须实现一个设置serialVersionUID的方法,就像hashcode方法一样.

那么,我错过了什么?对我来说似乎不是一把双刃剑.

更新1:

我的错误我给出了一个错误的例子,比较了一个类级别的东西和一个实例级别的东西.由于这个原因,我在不同公司看到了许多生产问题.但我的一般想法是不能让编译器以任何方式更加严格.

Gho*_*ica 6

请记住要求:

  • 构成ID的字节必须存在表示序列化对象的字节流中
  • 除非你发明了"在上面"的东西,否则到达那里的唯一方法就是使用一个字段
  • 对于类的所有对象,ID必须相同,因此ID 的来源应该是静态的

现在退后一步:

  • 没有多态性的静态方法
  • 从这个意义上说,如果在序列化对象时使用静态字段或调用静态方法来获取ID字节,则没有区别
  • 但是你要将这些字节写入流中

结论:使用静态字段可以解决以上所有问题.当您使用方法时 - 您仍然需要创建该字段.让它沉入:当使用方法时,实现必须调用方法,将其作为字段写入字节流 - 并且在读取字节流时,需要消耗该数字 - 因为它无法映射到"真正的"班上的领域.比较一下:有一个静态字段被写入字节流并从那里读取.

所以 - 从技术的角度来看,以某种方式在ID中集成这种ID 的自然方式是在类上要求静态字段.

当然你可能已经发明了别的东西.现代java 可能使用了注释.但是,当Java被发明时,这种注释的使用并不存在(并且这种序列化从第1天开始就在Java中).然后:现代java首先不使用"字节流"定向序列化.

或者正如Stephen建议的答案 - 您可以根据班级的当前内容计算该ID.但同样:这项技术是20年前发明的.那时候,计算 id可能需要花费你1,5,10秒.将其与读取静态字段的努力进行比较.