Java 处理两个自定义反序列化器

标签 java backwards-compatibility

所以这是一个非常奇怪的情况,我遇到过并且不知道如何处理。

我有一个服务,其中包含根据发送给它的请求反序列化对象的逻辑。现在正在更改有问题的对象,并实现了一种新的反序列化方法来处理该问题(不要问为什么,我所知道的是我们只需要更改反序列化方法)。

问题是这个改变需要向后兼容,所以我们应该能够处理这两种类型的对象。为了做到这一点,我们需要能够根据对象的类型确定要使用的正确反序列化器,但是如果对象被序列化到字节缓冲区中,我们该怎么做呢?我没有主意了...是否有不同/更好的方法来进行此更改?

该服务采用 Java 语言。

编辑 1:明确我的意图 .
旧对象使用自定义序列化器,新对象使用 ObjectMapper JSON 序列化器。所以我的目标是能够检测我是否正在处理旧对象或新对象,以便我可以相应地反序列化。
我可以尝试使用新的反序列化器并捕获它抛出的 JsonParseException,并在 catch block 中使用旧的序列化器,但这不是我想要处理 JsonParseException 的方式。

最佳答案

可序列化类应该有一个静态、最终且长整型的serialVersionUID。 这是为了确保被序列化的对象的类与被反序列化的对象的类相同。

为了实现向后兼容性,请按照以下步骤操作:

  1. 确保每当类结构发生更改时,您都会更改该字段的值。
  2. 使用新的自定义序列化程序来反序列化对象。
  3. 如果该对象属于前一个类,您将收到 InvalidClassException。捕获此异常并尝试使用 catch block 内的旧反序列化器反序列化该对象。

这可确保您的自定义解串器具有向后兼容性。

关于Java 处理两个自定义反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54891655/

相关文章:

c# - 为什么语言不在核心集成依赖注入(inject)?

java - UnsatisfiedLinkError问题

.net-3.5 - .net 4 向后兼容性

c++ - Visual C++ 错误 : RegGetValueA could not be located

c# - 此项目(Visual Studio 2012 Express)与当前版本的 Visual Studio 2013 Express 不兼容

internet-explorer - Microsoft Edge是否具有像IE一样的向后兼容模式

java - 1.5 之前的 jre 上是否有 pack200 的向后移植?

java - 如何在 Spring Boot 中禁用一项服务的身份验证?

java.lang.NumberFormatException : For input string: "currPage"

java - 发送 Post 请求抛出 500 内部错误