Kafka自定义反序列化器转换为Java对象

时间:2017-04-21 05:06:20

标签: apache-kafka kafka-consumer-api spring-kafka

我正在使用Spring Kafka集成,我有自己的值泛型序列化器/反序列化器,如下所示

  

串行:

public class KafkaSerializer<T> implements Serializer<T> {

  private ObjectMapper mapper;

  @Override
  public void close() {
  }

  @Override
  public void configure(final Map<String, ?> settings, final boolean isKey) {
    mapper = new ObjectMapper();
  }

  @Override
  public byte[] serialize(final String topic, final T object) {
    try {
      return mapper.writeValueAsBytes(object);
    } catch (final JsonProcessingException e) {
      throw new IllegalArgumentException(e);
    }
  }
}
  

解串器:

public class KafkaDeserializer<T> implements Deserializer<T> {

  private ObjectMapper mapper;

  @Override
  public void close() {
  }

  @Override
  public void configure(final Map<String, ?> settings, final boolean isKey) {
    mapper = new ObjectMapper();
  }

  @Override
  public T deserialize(final String topic, final byte[] bytes) {
    try {
      return mapper.readValue(bytes, new TypeReference<T>() {
      });
    } catch (final IOException e) {
      throw new IllegalArgumentException(e);
    }
  }
}

序列化程序工作正常但是当消耗消息时反序列化值得我得到一个LinkedHashMap而不是期望的对象,请提前告诉我我在哪里错误,提前谢谢。

1 个答案:

答案 0 :(得分:0)

有些情况需要确认:

  1. 您的Serializer正在运作
  2. Deserializer只是有效,但它返回了LinkedHashMap而不是您期望的对象,对吗?而且您无法将LinkedHashMap转换为object
  3. 我发现问题转移到如何将LinkedHashMap转换/转换为对象,并且您使用了ObjectMapper。如果所有情况都可以确认,我在这里发现一个好的帖子可能会回答你的问题Casting LinkedHashMap to Complex Object

    mapper.convertValue(desiredObject, new TypeReference<type-of-desiredObject>() { })
    

    ObjectMapper的API在[此处](https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind/ObjectMapper.html#convertValue(java.lang.Object,com.fasterxml.jackson.core.type.TypeReference))

    我希望我不会错过你的意图,你可以补充必要的情况,所以有人或我可以改善这个答案。