Apache kafka Kafka流:POJO序列化/反序列化

Apache kafka Kafka流:POJO序列化/反序列化,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我们可以使用Kafka Streams中的哪个类/方法将Java对象序列化/反序列化为字节数组,或者反之亦然?下面的链接建议使用ByteArrayOutputStream&ObjectOutputStream,但它们不是线程安全的 还有另一个使用ObjectMapper的选项,ObjectReader(用于线程安全),但它是从POJO->JSON->bytearray转换而来的。看来这是一个广泛的选择。希望检查是否有一种直接的方法将对象转换为bytearray,反之亦然,这是线程安全的。请建议

我们可以使用Kafka Streams中的哪个类/方法将Java对象序列化/反序列化为字节数组,或者反之亦然?下面的链接建议使用ByteArrayOutputStream&ObjectOutputStream,但它们不是线程安全的

还有另一个使用ObjectMapper的选项,ObjectReader(用于线程安全),但它是从POJO->JSON->bytearray转换而来的。看来这是一个广泛的选择。希望检查是否有一种直接的方法将对象转换为bytearray,反之亦然,这是线程安全的。请建议

import org.apache.kafka.common.serialization.Serializer;
public class HouseSerializer<T> implements Serializer<T>{
    private Class<T> tClass;
    public HouseSerializer(){

    }

    @SuppressWarnings("unchecked")
    @Override
    public void configure(Map configs, boolean isKey) {
        tClass = (Class<T>) configs.get("POJOClass");       
    }

    @Override
    public void close() {
    }

    @Override
    public byte[] serialize(String topic, T data) {
        //Object serialization to be performed here
        return null;
    }
}
import org.apache.kafka.common.serialization.Serializer;
公共类序列化程序实现序列化程序{
私有类tClass;
public House序列化程序(){
}
@抑制警告(“未选中”)
@凌驾
公共无效配置(映射配置、布尔isKey){
tClass=(类)configs.get(“POJOClass”);
}
@凌驾
公众假期结束(){
}
@凌驾
公共字节[]序列化(字符串主题,T数据){
//要在此处执行的对象序列化
返回null;
}
}

注:卡夫卡版本-0.10.1

想检查是否有直接的方法将对象转换为bytearray

如果可能的话,我建议您考虑使用Confluent模式注册表,但不是必需的。JSON是一个很好的退路,但它“在线路上”占用了更多的空间,因此也可以选择JSON

上面的示例使用从模式文件
src/main/resources/avro
生成一个LogLine类


否则,这取决于您,例如,字符串通常打包为

[(length of string) (UTF8 encoded bytes)]
而布尔值是单个0或1位

哪个是线程安全的


我理解这个问题,但您通常不会在线程之间共享反序列化数据。您可以为每个独立的邮件发送/读取/处理邮件

感谢以上回复。我知道每条消息本身都是Kafka对象的一个单独实例,但为了将其强制转换为Java对象,然后进行序列化/反序列化,我们可能会遇到竞速条件。我希望在上面的类方法“serialize”中有一种将数据值转换为字节数组的方法,Avro/JSON可以为您实现这一点,并且可以跨多种不同的语言使用,而不仅仅是“默认Java对象序列化”。你不需要自己去字节数组。如果使用JSON,只需使用StringSerializer