在使用FasterXML Jackson序列化之前将对象转换为“其他东西”

时间:2016-03-05 20:47:02

标签: java serialization jackson fasterxml

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

public void deserialize(InputStream input) throws Exception {}

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

我想序列化person对象,并能够从deserialize方法反序列化它。

然而,情况是我不能使用Java的可序列化接口,因为我无法确定将使用哪种IPerson实现。

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

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

此外,这会在反序列化时将其他内容转换为对象吗?我对将该对象转换为什么以及如何执行此操作的经验很少?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

使用默认update users set obs= CONCAT('string1', column1 , 'string2', column1 , 'string3' ) where area='it' 时,您必须确保序列化的对象是 Java Beans 。对于非bean类,您可以使用ObjectMapper设置字段可见性,或使用m.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);注释您的类。

对于反序列化,您必须告诉@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)目标类型。这可以通过向ObjectMapper提供具体实现类型或将类名存储在导出的JSON中来完成。为此,您可以设置readValue并使用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(有关详细信息,请参阅jackson-annotations