Jackson是否允许仅在特定类别中为特定类型自定义序列化?
这是我的情景: 我有ClassA.java,它类似于:
public Class ClassA {
byte[] token;
String name;
public getToken() {
return token;
}
public setToken(byte[] newToken) {
token = newToken;
}
public getName() {
return name;
}
public setName(String newName) {
name = newName;
}
}
我无法访问此类,因为它位于外部jar中。但是,我想以特定方式在此处序列化令牌字节数组。我创建了一个自定义序列化程序,并尝试以杰克逊文档中提到的所有方式将其添加到映射器中。
public class ByteArrayJacksonSerializer extends JsonSerializer<byte[]> {
public void serialize(byte[] value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
String token = doMyThing(value);
jgen.writeString(token);
}
}
在mapper中,有这样的东西:
public class MyObjectMapper extends ObjectMapper {
CustomSerializerFactory sf = new CustomSerializerFactory();
sf.addGenericMapping(byte[].class, new ByteArrayJacksonSerializer());
this.setSerializerFactory(sf);
and some more code here...
}
但是我一般只能用于byte [],而不能用于ClassA中的ONLY byte []。有没有办法让杰克逊知道这个自定义序列化器必须只用于ClassA中byte []类型的字段,并且为所有其他类做自己的序列化?
答案 0 :(得分:6)
您应该使用MixIn功能。在您的示例中,您必须创建新界面:
interface ClassAMixIn {
@JsonSerialize(using = ByteArrayJacksonSerializer.class)
byte[] getToken();
}
指定给定属性的自定义序列化程序。现在我们必须配置ObjectMapper
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(ClassA.class, ClassAMixIn.class);
您的自定义序列化程序仅用于序列化ClassA
中的字节数组属性。