Kafka Streams:POJO序列化/反序列化

时间:2018-05-16 17:58:39

标签: apache-kafka apache-kafka-streams

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

Send Custom Java Objects to Kafka Topic

还有另一个选项可以使用ObjectMapper,ObjectReader(用于线程安全),但是从POJO转换 - > JSON - >字节组。似乎这个选项很广泛。想要检查是否有直接的方法将对象转换为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;
    }
}


注:Kafka版本 - 0.10.1

1 个答案:

答案 0 :(得分:2)

  

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

如果可能的话,我建议您查看将Avro serialization与Confluent Schema Registry一起使用,但不是必需的。 JSON是一个很好的后退,但在线上会占用更多的空间&#34;,因此MsgPack将是替代品。

See Avro code example here

上面的示例使用avro-maven-pluginsrc/main/resources/avro模式文件生成LogLine类。

否则,how to serialize your object into a byte array取决于您,例如,字符串通常打包为

[(length of string) (UTF8 encoded bytes)]

虽然布尔值是单个0或1位

  

是线程安全的

我理解这种担忧,但您通常不会在线程之间共享反序列化数据。您为每个独立的消息发送/读取/处理消息。