java - 处理不再存在的枚举值的反序列化

标签 java serialization enums

我有一个枚举 JJJ,它有 3 个值:A、B 和 C。在我的程序的早期版本中,它还有一个附加值:D。我希望能够读取由以前版本创建的序列化对象程序的多个版本,但当在序列化对象中遇到值为“D”的 JJJ 类型变量时,会引发异常。最理想的是,我希望能够拦截反序列化过程并告诉它在遇到 D 时将它们映射到 C。

根据http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html (枚举常量的序列化),听起来没有一种简单的方法可以做到这一点...我知道一种方法是在包含 JJJ 类型的成员变量的类上重写 readObject,但这会很困难由于程序的大小和范围,这很痛苦(数十个可序列化的类具有 JJJ 类型的成员变量,并且重写 readObject 来处理 JJJ 字段意味着我还必须手动处理所有其他字段)。

我还尝试通过滚动我自己的 ObjectInputStream 子类来解决这个问题,但不幸的是,我真正需要获取和覆盖来解决这个问题的枚举反序列化位都是私有(private)的或包私有(private)的......

有什么建议吗?

最佳答案

我还没有真正尝试过这个,但也许它可以工作:

  1. 创建一个新类“oldClass”,其字段与旧类完全相同。

  2. this post describes的方式扩展ObjectInputStream这样您就可以在“oldClass”的实例中进行反序列化。

  3. 在您创建的“oldClass”中,实现“readResolve()”,以便您返回类的新版本的实例,并根据需要更改缺少的字段。

    <

关于java - 处理不再存在的枚举值的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743668/

相关文章:

java - 枚举:创建具有不同值的相同 "type"的多个枚举?

javascript - .Net javascript 共享枚举

java - Applet - Servlet 通信

java - Spark 中的嵌套并行化?正确的做法是什么?

java - Spring请求范围bean代理bean无法注入(inject)

c# - 反序列化自定义 JsonConverter 中的数据导致 StackOverflow

java - 在什么情况下Java性能会随着内存的增加而降低?

c++ - 如何序列化对象以通过网络发送

java - 通过 Fitnesse 测试第三方 API

c# - 解析字符串以匹配枚举值