kafka自定义反序列化程序转换为java对象

mdfafbf1  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(407)

我使用的是springkafka集成,我有自己的值generic serializer/deserializer,如下所示
序列化程序:

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 请告诉我哪里错了,而不是想要的东西,提前谢谢。

whlutmcx

whlutmcx1#

有些情况需要确认:
你的 Serializer is工作
这个 Deserializer 只是工作,但它返回了一个 LinkedHashMap 而不是你想要的东西,对吧?你不能把它转换成 LinkedHashMap 给你的 object .
我发现问题转移到如何将linkedhashmap转换/强制转换为对象,而您使用了 ObjectMapper . 如果所有的情况都能得到证实,我发现这里有一个很好的帖子可以回答你的问题,把linkedhashmap投射到复杂的物体上

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)
我希望我没有错过你的意图,你可以补充必要的情况,这样有人或我可以改善这个答案。

相关问题