在使用 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)
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)
.
对于反序列化,您必须告诉 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)