代码之家  ›  专栏  ›  技术社区  ›  Raman

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

  •  1
  • Raman  · 技术社区  · 6 年前

    我们可以使用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;
        }
    }
    


    注:卡夫卡版本-0.10.1

    1 回复  |  直到 6 年前
        1
  •  2
  •   OneCricketeer Gabriele Mariotti    6 年前

    想看看是否有一种直接的方法将对象转换成字节数组

    我建议你使用 Avro serialization 如果可能,使用汇合模式注册表,但不是必需的。JSON是一种很好的后备方法,但需要更多的“在线”空间,等等 MsgPack 将是另一种选择。

    See Avro code example here

    上面的示例使用 avro-maven-plugin src/main/resources/avro 架构文件。


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

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

    而布尔值是单个0或1位

    这是线程安全的

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