【问题标题】:Compatible changes and serialversionUID兼容的更改和serialversionUID
【发布时间】:2015-09-30 08:05:21
【问题描述】:

我需要关于兼容更改和 serialVersionUID (http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html#6678) 的建议。

我在一个带有“客户端”项目的系统上工作,该项目使用 RPC 与“服务器”项目通信(“服务器”使用 DTO 类从数据库导出数据,“客户端”使用相同的 DTO 类呈现该数据)。

当在 DTO 类中添加字段时,团队决定不更改 serialversionUID,因此当部署新版本的“服务器”时,不需要立即部署“客户端”,因为旧版本DTO 类与新的类兼容。

但是(因为我们在两个项目中都有几十个系统实例),如果使用新版本的 DTO 类部署了新版本的“客户端”,而“服务器”由于某种原因仍保留在旧版本中,那么DTO 类的新字段将解析为 null,并以 null 的形式呈现给客户,这可能是不正确的。

是否有解决此问题的最佳实践?我们可以在 DTO 类中进行任何类型的更改时更改 UID,但是我们总是必须同时部署两个项目,即使没有使用更改,我们正在努力避免这种情况......

【问题讨论】:

    标签: java serialization serialversionuid


    【解决方案1】:

    更改 UID 不是解决方案,而是问题的一部分。不要那样做。

    添加新字段时,您还可以在同一类的readObject() 方法中添加逻辑,以便在其为空时为其提供合理的默认值。

    【讨论】:

    • 谢谢,会尝试,但我不知道默认值是否会有所帮助。抛出异常是理想的,但前提是序列化类被反序列化为更新版本(即,当序列化类中不存在新字段时)。是否有一种简单的方法可以在反序列化期间检测流中是否存在字段,或者它是否总是解析为 null?
    • 为什么要抛出异常?这不是动态条件。从部署状态完全可以预测新字段是否存在。
    • 两个应用程序都有30多个实例,有时客户端应用程序必须在服务器应用程序之前部署。我知道这是一个不同的问题,但现在是这样。我认为最好给出一些“维护中”的消息,而不是向用户提供错误的值(例如,如果该字段不存在,布尔字段将设置为 false)。
    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 2012-01-28
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2014-11-11
    相关资源
    最近更新 更多