每次我在 JSF 项目中进行更改时都需要更新 serialVersionUID

serialVersionUID needs to be updated everytime I make changes in my JSF project

很烦人,每次修改managedbean都需要生成一个新的serial version id,才能修改我的项目,很不方便,我还以为我的有问题服务器所以我重新启动了我的 apache 几次,现在我发现应该删除 serialversion id 然后一遍又一遍地生成,我这是如何 JSF 工作的?

编辑: 现在每次我修改我的代码时它变得很糟糕,我会删除 serialversion id,生成一个新的,然后再次生成,否则如果不会应用更改,非常糟糕

编辑: 现在我的项目 运行 正确,我的问题的简单答案是,我没有生成 serialVersionID 并且总是清理项目。有时 IDE 未检测到其他 类 中的更改,因此您需要清理并重新启动服务器。

好吧,serialVersionUID 的目的是处理 class 中的更改,这些更改将(或可能)导致序列化的 classes 代码出现问题和反序列化一个对象是不同的。有几种方法:

  1. 不要使用 serialVersionUID 字段。 JVM 将根据正在序列化和反序列化的 class 的版本动态生成 UID。如果 UID 不匹配,您将得到一个异常。

  2. 使用 serialVersionUID 字段并且不更新它。这有点危险。如果你做了一个 incompatible 的改变,你会 probably 得到一个异常,因为序列化的 class 中的表示描述符不匹配反序列化器期望。但你可能不会,那个才是真正的问题。 (传输的数据可能有错误的含义!)

    如果您确定 class 在序列化和反序列化时的版本将始终,那么这是安全的是相同的。但是您可以保证的场景/用例非常不寻常。

  3. 使用 serialVersionUID 字段并仅在您进行 class 更改且您评估可能会导致版本兼容性问题时才重新生成它。风险在于您弄错了,并且在需要时不重新生成。这将导致与上述 2. 相同的问题。

  4. 使用 serialVersionUID 字段并在您更改 class 时重新生成它。

  5. 不要使用对象序列化。请改用 XML 或 JSON。 (使用模式......如果你想要一定程度的接口兼容性检查。)


但最重要的是,您实际上无法避免分布式系统中服务之间传递的表示的兼容性问题。