未知对象的反序列化

时间:2018-05-17 12:32:17

标签: java serialization deserialization classnotfoundexception

遇到了一个有趣的案例: 有一些"空间"(Mq-queue,Kafka-topic,简单文件夹,等等)。在此空间中以序列化形式编写Java-Object。有一个听众倾听这个空间。问题是:作为此侦听器,我如何从此序列化对象中获取一些数据,而无需在侦听器中实现此类。

我真的不想看到这堂课的所有逻辑。要查看对象字段就足够了(例如map:someObjectField => someFieldValue)。

现在,当我尝试反序列化此对象时,我会抓住"classNotFoundException"。有没有可能避免这个问题,而不重写所有默认的Java反序列化逻辑? (也许某些工具已经存在?)

1 个答案:

答案 0 :(得分:0)

我认为你没有指定反序列化器。 实际上,在创建消费者时,您需要在消费者的属性中提供反序列化器类以及引导服务器和其他属性。 例如

public class KafkaConsumerExample {
  ...

  private static Consumer<Long, String> createConsumer() {
     final Properties props = new Properties();
      props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
                                  BOOTSTRAP_SERVERS);
      props.put(ConsumerConfig.GROUP_ID_CONFIG,
                                  "KafkaExampleConsumer");
      props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
              LongDeserializer.class.getName());
      //depends on your key serialiser if it’s long then you should use long or else what ever data type you use 
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
                  StringDeserializer.class.getName());

      // Create the consumer using props.
      final Consumer<Long, String> consumer =
                                  new KafkaConsumer<>(props);

      // Subscribe to the topic.
      consumer.subscribe(Collections.singletonList(TOPIC));
      return consumer;
  }
  ...
}

如果您使用的是某些自定义序列化程序,则必须创建自定义反序列化程序。