在使用 FasterXML Jackson 序列化之前将对象转换为 "something else"

Converting Object into "something else" before Serializing it using FasterXML Jackson

public void serialize(IPerson person, OutputStream output) throws Exception {}

public void deserialize(InputStream input) throws Exception {}

我有一个名为 IPerson 的界面,它具有基本功能。

我想序列化 person 对象并能够从反序列化方法对其进行反序列化。

但是,我无法使用 Java 的可序列化接口,因为我无法确定将使用哪种 IPerson 实现。

我选择使用Jackson's FasterXML,使用ObjectMapper m = new ObjectMapper();

我遇到的问题是,由于 IPerson 是一个接口,我无法使用 mapper.writerValue(output, person) 直接序列化它,我认为我必须将此对象转换为其他对象,例如 ByteArray,然后序列化它?

还有,反序列化的时候会把this something else转化为对象吗?我对我应该将这个对象转换成什么以及如何转换的经验很少?有什么想法吗?

使用默认 ObjectMapper 时,您必须确保序列化的对象是 Java Beans。对于非 bean classes,您可以使用 m.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 设置字段可见性或使用 @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY).

注释您的 class

对于反序列化,您必须告诉 ObjectMapper 目标类型。这可以通过向 readValue 提供具体的实现类型或通过将 class 名称存储在导出的 JSON 中来完成。为此,您可以设置 m.enableDefaultTypingAsProperty(DefaultTyping.OBJECT_AND_NON_CONCRETE, "__class"); 并使用 @JsonTypeInfo

注释您的对象
ObjectMapper om = new ObjectMapper();
om.enableDefaultTypingAsProperty(DefaultTyping.OBJECT_AND_NON_CONCRETE, "__class");

IPerson value = new MyPerson();
String s = om.writeValueAsString(value);
IPerson d = om.readValue(s, IPerson.class);

使用

interface IPerson {
   void doSomething();
}

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "__class")
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
class MyPerson implements IPerson {
    String name;

    @Override
    public void doSomething() {
    }
}

请注意,您将需要一个默认构造函数才能使用或使用 @JsonCreator@JsonProperty(有关详细信息,请参阅 jackson-annotations