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然后序列化它?
此外,这会在反序列化时将其他内容转换为对象吗?我对将该对象转换为什么以及如何执行此操作的经验很少?有什么想法吗?
答案 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)