1

我正在使用 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而不是期望的对象,请告诉我我在哪里弄错了,在此先感谢。

4

1 回答 1

0

有些情况需要确认:

  1. Serializer的作品
  2. Deserializer只是有效,但它返回 a而LinkedHashMap不是您期望的对象,对吗?而且您无法将其转换LinkedHashMap为您的object.

我发现问题转移到How to Convert/Cast a LinkedHashMap to a Object,您使用了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. fastxml.jackson.core.type.TypeReference))

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

于 2017-04-21T08:26:31.407 回答