如何处理包已更改的 Java 序列化对象?
我有一个 Java 类,它存储在一个 HttpSession 对象中,该对象被序列化并在集群环境中的服务器之间传输。出于本解释的目的,让我们将此类称为“Person”。
在改进代码的过程中,此类已从“com.acme.Person”移至“com.acme.entity.Person”。在内部,类保持完全相同(相同的字段,相同的方法,相同的一切)。
问题是我们有两组服务器同时运行旧代码和新代码。具有旧代码的服务器已序列化 HttpSession 对象,当新代码取消序列化它时,它会抛出一个 ClassNotFoundException,因为它找不到对 com.acme.Person 的旧引用。此时,处理这个问题很容易,因为我们可以使用新包重新创建对象。然后问题就变成了新服务器中的 HttpSession 将使用对 com.acme.entity.Person 的新引用序列化对象,并且当在运行旧代码的服务器中取消序列化该对象时,将引发另一个异常。在这一点上,我们不能再处理这个异常了。
对于此类案件,最好的策略是什么?有没有办法告诉新服务器使用对旧包的引用序列化对象,并将对旧包的引用取消序列化为新包?一旦所有服务器都运行新代码,我们将如何过渡到使用新包并忘记旧包?