Пользовательский Сериализатор Джексона для определенного типа в определенном классе

1

Есть ли способ, с помощью которого Джексон позволяет настраивать сериализацию для определенного типа только в определенном классе?

Вот мой сценарий: у меня есть 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;
    }
}

У меня нет доступа к этому классу, как во внешней банке. Тем не менее, я хочу сериализовать массив байтов токена здесь определенным образом. Я создал собственный сериализатор, который делает это, и пытается добавить его к картографу всеми способами, упомянутыми в документах Джексона.

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...
}

Однако я могу сделать это только для байта [] вообще, а не для ТОЛЬКО байта [] в ClassA. Есть ли способ, чтобы Джексон знал, что этот пользовательский сериализатор должен использоваться ТОЛЬКО для полей типа byte [] в ClassA, и сделать сериализацию его собственным способом для всех других классов?

Теги:
serialization
jackson

1 ответ

3

Вы должны использовать функцию MixIn. В вашем примере вам нужно создать новый интерфейс:

interface ClassAMixIn {

    @JsonSerialize(using = ByteArrayJacksonSerializer.class)
    byte[] getToken();
}

который задает пользовательский сериализатор для данного свойства. Теперь нам нужно настроить ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(ClassA.class, ClassAMixIn.class);

Ваш собственный сериализатор будет использоваться только для сериализации свойства массива байтов в ClassA.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню