当前位置: 首页 > 知识库问答 >
问题:

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

法和安
2023-03-14

我正在使用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个答案

韩靖琪
2023-03-14

有些情况需要确认:

  1. 您的串行器工作正常
  2. Deserializer只是工作,但它返回了一个LinkedHashMap而不是您期望的对象,对吗?并且您无法将该LinkedHashMap转换为您的对象

我发现问题转移到如何将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))

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

 类似资料:
  • 问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将

  • 我在一个Kafka消息中使用了我自己的类,它有一堆字符串数据类型。 我想我需要编写自己的序列化器并将其提供给生产者属性?

  • 我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢

  • 情况如下:我已经设法让Jackson反序列化以下通用 作为HTTP客户端,并使用exchange

  • 我正在构建一个简单的项目与Spring boot和sping-kafka,我不能配置它,使其工作,它是一个简单的应用程序,生成笔记(作者,内容,createddatetime,lastmodefieddatetime)和发送基于笔记的事件,当他们被创建。 我已经玩了两天了,但我想我还没学会。 这是我的配置,我很确定它有很多锅炉板,但我已经用了几个例子来使我的工作。 我有2个生产者和消费者工厂,因为

  • 问题内容: 我有以下课程: 当我执行以下代码时: 产生的json字符串如下所示: 我的问题是让上面的json字符串反序列化回一个 宾语。 我的反序列化代码如下所示: 它使用正确的键反序列化为HashMap,但不会为这些值创建Theme对象。我不知道在readValue()方法中要指定什么而不是“ HashMap.class”。 任何帮助,将不胜感激。 问题答案: 你应该创建特定的Map类型并将其提