我有一个枚举 JJJ,它有 3 个值:A、B 和 C。在我的程序的早期版本中,它还有一个附加值:D。我希望能够读取由早期版本的程序创建的序列化对象。程序中,但在序列化对象中遇到值为“D”的 JJJ 类型变量时会抛出异常。最理想的情况是,我希望能够拦截反序列化过程,并告诉它在遇到 D 时将它们映射到 C。
根据http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html(枚举常量的序列化),听起来没有一种简单的方法可以做到这一点...我知道一种方法是在包含 JJJ 类型的成员变量的类上重写 readObject,但这会很困难由于程序的大小和范围,这很痛苦(数十个可序列化的类具有 JJJ 类型的成员变量,并且重写 readObject 来处理 JJJ 字段意味着我还必须手动处理所有其他字段)。
我还尝试通过滚动我自己的 ObjectInputStream 子类来解决这个问题,但不幸的是,我真正需要获取和覆盖来解决这个问题的枚举反序列化位都是私有的或包私有的......
有什么建议么?
我实际上没有尝试过这个,但也许它可以工作:
创建一个新类“oldClass”,其字段与旧类完全相同。
扩展ObjectInputStream的方式这篇文章描述了 https://stackoverflow.com/questions/2358886/how-can-i-deserialize-the-object-if-it-was-moved-to-another-package-or-renamed/3916282#3916282这样您就可以在“oldClass”的实例中进行反序列化。
在您创建的“oldClass”中,实现“readResolve()”,以便您返回类的新版本的实例,并根据需要更改丢失的字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)