代码之家  ›  专栏  ›  技术社区  ›  Daniel Fortunov

如果更改Java异常类扩展的基类,是否需要更新SerialValueUID值?

  •  3
  • Daniel Fortunov  · 技术社区  · 15 年前

    考虑下面的Java异常类:

    public class BarException extends RuntimeException {
        // [...]
    }
    
    public class FooException extends BarException {
        private static final long serialVersionUID = -5322002268075295537L;
    
        // [...]
    }
    

    如果我希望更新继承层次结构以删除 BarException ,这样 FooException 直接源自 RuntimeException ,是否需要更改 serialVersionUID 价值?

    // FooException with updated inheritance hierarchy
    public class FooException extends RuntimeException {
        private static final long serialVersionUID = ???;
    
        // [...]
    }
    
    4 回复  |  直到 13 年前
        1
  •  5
  •   Michael Borgwardt    15 年前

    是的。”按照 serialization spec .

        2
  •  2
  •   Daniel Fortunov    15 年前

    这个 Java 1.5 Serialization Specification 建议从继承层次结构中移除类是兼容的更改,因此更改为 serialVersionUID 不需要。

    序列化流中与 BarException 在反序列化到新的 FooException (直接来源于 RuntimeException )

        3
  •  2
  •   Daniel Fortunov    15 年前

    鉴于规范不够清晰,导致混乱和争论,没有明确的答案,唯一的选择就是相信经验证据。

    以上述问题为例 FooException 来源于 BarException 来源于 RuntimeException ,然后移除 无意识 从继承链中,我构建了一个示例应用程序,尝试以各种组合进行序列化和反序列化。

    我得到以下结果:

    只要我保持 serialVersionUID 不变,我可以成功地序列化和反序列化原始 足例外 作为更新 足例外 ,请 反之亦然。

    以下注意事项适用:

    • 我使用的是JDK1.5.0 U07,没有在任何其他版本上尝试过。
    • 足例外 具有类型的成员 int Exception ,已成功反序列化。
    • 无意识 不向添加其他成员 运行期异常 .
        4
  •  0
  •   SteveD    15 年前

    技术上是的,但这取决于您的系统是否坚持序列化对象,以及您是否控制新的重构代码的部署方式。

    如果您不进行持久化,并且您将使用新版本的代码刷新整个部署,我认为不需要更改 serialVersionUID .

    推荐文章