0

使用 Jackson,我如何让一个应用程序使用一组类对 JSON 进行序列化/反序列化,但让另一个应用程序反序列化相同的 JSON 并加载这些类的不同实现?

我有一个(Spring MVC)Web 应用程序,它允许用户在脚本中定义步骤,然后将在客户端应用程序中执行。步骤可能是类似ShowDialogStep的,具有类似的属性dialogText,或WaitStep具有的属性duration

客户端应用程序将从服务器加载步骤集合。但是,客户端实例化的类需要具有特定于执行的功能,例如execute(),在这种情况下,WaitStep它将跟踪等待的时间。显然,服务器端应用程序永远不需要知道这一点,并且在不那么琐碎的示例中,步骤的执行/更新逻辑涉及各种特定于客户端的依赖关系。

所以,回顾一下我需要:

  • 将“原型”类映射到 JSON 的服务器应用程序;
  • 客户端应用程序读取相同的JSON,但实例化特定于执行的类而不是“原型”类。

这是否可以在客户端映射器上配置,也许如果 JSON 是使用相对类名(而不是完全限定的)序列化的,那么可以将反序列化器配置为在不同的包中查找具有执行逻辑的实现在他们中?

4

1 回答 1

3

您可以使用这种方法:

在服务器端:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
      include=JsonTypeInfo.As.PROPERTY, property="@type")
class Prototype {
...
}

objectMapper.registerSubtypes(
            new NamedType(Prototype.class, "Execution"),
            ...
);

然后它将序列化一个 Prototype 实例并添加一个 bean 类型:

{
  "@type" : "Execution",
  ...
}

在客户端:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
      include=JsonTypeInfo.As.PROPERTY, property="@type")
class Execution {
...
}

objectMapper.registerSubtypes(
            new NamedType(Execution.class, "Execution"), // the same name
    ....
);
objectMapper.readValue(....); // will be deserialized to an Execution instance
于 2012-05-03T16:17:54.157 回答