我正在研究Java序列化机制中的不同选项,以允许我们的类结构灵活地进行版本容忍存储(并提倡不同的机制,您不需要告诉我).
例如,如果只需要向后兼容性,则默认序列化机制可以处理添加和删除字段.
但是,重命名一个类或将它移动到另一个包中已经证明要困难得多.我在这个问题中发现我能够通过继承ObjectInputStream并覆盖readClassDescriptor()来做一个简单的类重命名和/或移动包:
if (resultClassDescriptor.getName().equals("package.OldClass"))
resultClassDescriptor = ObjectStreamClass.lookup(newpackage.NewClass.class);
Run Code Online (Sandbox Code Playgroud)
对于简单的重命名,这很好.但是,如果您尝试添加或删除字段,则会收到java.io.StreamCorruptedException.更糟糕的是,即使添加或删除了某个字段,然后重命名该类,也会发生这种情况,这可能会导致多个开发人员或多个签名出现问题.
基于我已经完成的一些阅读,我尝试了一下同样重写了resolveClass(),并且我们正确地将名称重新命名为新类,但没有加载旧类本身并轰炸字段更改.但这来自于对序列化机制的一些细节的非常模糊的理解,我不确定我是否甚至咆哮着正确的树.
所以2个确切的问题:
我四处寻找,无法在SO上找到一个同等的问题.无论如何,请指出这样一个问题,如果它存在,但请仔细阅读这个问题,除非另一个问题实际上回答了我的确切问题,否则你不要关闭我.