我有一个Java类存储在HttpSession对象中,该对象在集群环境中的服务器之间进行序列化和传输.出于此解释的目的,我们将此类称为"Person".
在改进代码的过程中,这个类从"com.acme.Person"转移到"com.acme.entity.Person".在内部,类保持完全相同(相同的字段,相同的方法,相同的一切).
问题是我们有两组服务器同时运行旧代码和新代码.具有旧代码的服务器具有序列化的HttpSession对象,并且当新代码反序列化它时,它会抛出ClassNotFoundException,因为它找不到对com.acme.Person的旧引用.此时,处理这个很容易,因为我们可以使用新包重新创建对象.然后问题变成新服务器中的HttpSession将使用对com.acme.entity.Person的新引用来序列化对象,并且当在运行旧代码的服务器中对其进行反序列化时,将抛出另一个异常.此时,我们再也无法处理此异常.
对于这类案件,最好的策略是什么?有没有办法告诉新服务器通过引用旧包序列化对象并将旧包的引用反序列化为新包?所有服务器运行新代码后,我们将如何过渡到使用新包并忘记旧包?
我将a序列化为一个ArrayList<packageA.Changelog> list文件并将文件传输到另一台机器中的另一个系统.
因为它是一个接收文件的不同系统,所以我没有相同的packageA.Changelog类,而是packageB.Changelog具有完全相同的结构但是在不同的包中.
当我使用时
ArrayList<packageB.Changelog> changelogs = (ArrayList<packageB.Changelog>)ois.readObject();
从我得到的文件中读出来ClassCastException.
如何避免这种异常?我是否需要在其他系统中创建相同的包结构才能接收列表?