针对特定类别中的特定类型的自定义Jackson Serializer

san*_*ris 3 java serialization json 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有访问这个类,因为它在外部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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在mapper中,这样的事情:

public class MyObjectMapper extends ObjectMapper {

    CustomSerializerFactory sf = new CustomSerializerFactory();
    sf.addGenericMapping(byte[].class, new ByteArrayJacksonSerializer());
    this.setSerializerFactory(sf);

    and some more code here...
}
Run Code Online (Sandbox Code Playgroud)

但是我一般只能用于byte [],而不能用于ClassA中的ONLY byte [].有没有办法让杰克逊知道这个自定义序列化程序必须只用于ClassA中byte []类型的字段,并且对所有其他类进行序列化它自己的方式?

Mic*_*ber 6

您应该使用MixIn功能.在您的示例中,您必须创建新接口:

interface ClassAMixIn {

    @JsonSerialize(using = ByteArrayJacksonSerializer.class)
    byte[] getToken();
}
Run Code Online (Sandbox Code Playgroud)

它为给定属性指定自定义序列化程序.现在我们必须配置ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(ClassA.class, ClassAMixIn.class);
Run Code Online (Sandbox Code Playgroud)

您的自定义序列化程序将仅用于序列化字节数组属性ClassA.