2015-07-11 56 views
1

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

我使用'client'项目与使用RPC的'server'项目进行通信的系统上工作('server'使用DTO类从数据库导出数据,'client'使用相同的DTO类来呈现数据。

当在DTO类中添加一个字段时,团队决定不更改serialversionUID,所以当部署新版本的'server'时,'client'不需要立即部署,因为旧版本的DTO类与新的兼容。但是(因为我们有两个项目都有几十个系统实例),如果在新版本的DTO类中部署了新版本的'客户端',而由于某种原因'服务器'仍然保留在旧版本中,那么DTO类的新字段将解析为null,并且将作为null呈现给客户,这可能不正确。

有没有解决这个问题的最佳实践?我们可以在DTO类的任何类型的更改上更改UID,但是随后我们将始终不得不同时部署两个项目,即使未使用更改也是如此,并且我们正试图避免这种情况...

回答

0

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

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

+0

谢谢,会尝试,但我不知道默认值是否会有所帮助。抛出一个异常是理想的,但只有当序列化类被反序列化为新的版本时(例如,当序列化的新字段不存在时)。是否有一种简单的方法来检测反序列化过程中字段是否存在于流中,还是一直会解析为null? – Uros

+0

你为什么要抛出异常?这不是一个动态的条件。从部署的状态来看,新领域是否存在是完全可预测的。 – EJP

+0

这两个应用程序都有30多个实例,并且有时必须在服务器应用程序之前部署客户端应用程序。我知道这是一个不同的问题,但现在是这样。我认为最好给出一些“维护中”的消息,而不是给用户提供错误的值(例如,如果该字段不存在,布尔型字段将被设置为false)。 – Uros