兼容的更改和 serialversionUID
Compatible changes and serialversionUID
我需要有关兼容更改和 serialVersionUID (http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html#6678) 的建议。
我在一个带有 'client' 项目的系统上工作,该项目使用 RPC 与 'server' 项目通信('server' 使用 DTO classes 和 'client' 使用相同的 DTO classes).
显示数据
当在 DTO class 中添加字段时,团队决定不更改 serialversionUID,因此当部署新版本 'server' 时,'client' 不需要立即部署,因为旧版本的 DTO class 与新版本兼容。
但是(因为我们在两个项目中都有几十个系统实例),如果使用新版本的 DTO class 和 'server' 部署新版本的 'client'由于某些原因保留在旧版本,然后 DTO class 的新字段将解析为 null,并将显示为 null 给客户,这可能是不正确的。
是否有解决此问题的最佳做法?我们可以在 DTO classes 中对任何类型的更改更改 UID,但是我们将始终必须同时部署两个项目,即使未使用更改,我们也在努力避免这种情况。 ..
更改 UID 不是解决方案,它只是问题的一部分。不要那样做。
当您添加新字段时,您还可以将逻辑添加到相同 class 的 readObject()
方法中,以便在它为 null 时为其提供合理的默认值。
我需要有关兼容更改和 serialVersionUID (http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html#6678) 的建议。
我在一个带有 'client' 项目的系统上工作,该项目使用 RPC 与 'server' 项目通信('server' 使用 DTO classes 和 'client' 使用相同的 DTO classes).
显示数据当在 DTO class 中添加字段时,团队决定不更改 serialversionUID,因此当部署新版本 'server' 时,'client' 不需要立即部署,因为旧版本的 DTO class 与新版本兼容。
但是(因为我们在两个项目中都有几十个系统实例),如果使用新版本的 DTO class 和 'server' 部署新版本的 'client'由于某些原因保留在旧版本,然后 DTO class 的新字段将解析为 null,并将显示为 null 给客户,这可能是不正确的。
是否有解决此问题的最佳做法?我们可以在 DTO classes 中对任何类型的更改更改 UID,但是我们将始终必须同时部署两个项目,即使未使用更改,我们也在努力避免这种情况。 ..
更改 UID 不是解决方案,它只是问题的一部分。不要那样做。
当您添加新字段时,您还可以将逻辑添加到相同 class 的 readObject()
方法中,以便在它为 null 时为其提供合理的默认值。