Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡的LongSerializer vs ByteArraserializer_Java_Apache Kafka - Fatal编程技术网

Java 卡夫卡的LongSerializer vs ByteArraserializer

Java 卡夫卡的LongSerializer vs ByteArraserializer,java,apache-kafka,Java,Apache Kafka,我是卡夫卡的新手,试图了解使用一些东西的最佳方式。我有一个主题,它将有10个分区,我正在使用kafka producer向它发送数据。我的密钥将是client\u id,它是长数据类型,值将是字节数组。因此,我应该为我的密钥序列化程序(key.serializer)使用longeserializer,还是应该将我的客户端id转换为代码本身中的字节数组,然后为密钥序列化程序使用ByArraySerializer 所以问题是直接使用lonserializer和使用ByteArraySerialize

我是卡夫卡的新手,试图了解使用一些东西的最佳方式。我有一个主题,它将有10个分区,我正在使用kafka producer向它发送数据。我的密钥将是
client\u id
,它是长数据类型,值将是字节数组。因此,我应该为我的密钥序列化程序
(key.serializer)
使用
longeserializer
,还是应该将我的
客户端id
转换为代码本身中的字节数组,然后为
密钥序列化程序
使用
ByArraySerializer

所以问题是直接使用
lonserializer
和使用
ByteArraySerializer
有什么区别。在这两种情况下,它都将long转换为字节数组


我正在运行Kafka 0.10.0.0版本。

LongSerializer的serialize方法只接受Long/Long类型参数,该参数在内部将长类型整数转换为字节数组。如果使用ByteArraySerializer,则在传递给ByteArraySerializer之前,必须进行此转换。

不同的是,生产者上的send()采用长字节数组vs字节数组的生产者记录。在某种程度上,这是正确的,但通常情况下,您希望ProducerRecord类型与用户代码使用的类型相匹配,而无需进行额外转换

我的密钥将是client_id,它是长数据类型,值将是 字节数组

很明显,对于键,您应该使用LongSerializer,对于value,您应该使用TearArraySerializer

LongSerializer与ByteArraserializer的使用

如上所述,在上述答案中,任何对象都可以(也将)序列化为
字节[]
,包括您的长对象。 因此,即使是
longeserializer
内部也只会这样做

public class LongSerializer implements Serializer<Long> {

    public void configure(Map<String, ?> configs, boolean isKey) {
        // nothing to do
    }

    public byte[] serialize(String topic, Long data) {
        if (data == null)
            return null;

        return new byte[] {
            (byte) (data >>> 56),
            (byte) (data >>> 48),
            (byte) (data >>> 40),
            (byte) (data >>> 32),
            (byte) (data >>> 24),
            (byte) (data >>> 16),
            (byte) (data >>> 8),
            data.byteValue()
        };
    }

    public void close() {
        // nothing to do
    }
}
公共类lonserializer实现序列化程序{
公共无效配置(映射配置、布尔isKey){
//无事可做
}
公共字节[]序列化(字符串主题,长数据){
如果(数据==null)
返回null;
返回新字节[]{
(字节)(数据>>>56),
(字节)(数据>>>48),
(字节)(数据>>>40),
(字节)(数据>>>32),
(字节)(数据>>>24),
(字节)(数据>>>16),
(字节)(数据>>>8),
data.byteValue()
};
}
公众假期结束(){
//无事可做
}
}

所以,最好使用LongSerializer for your键(这样您就不必担心转换)。为什么要重新发明轮子?

是的,我对这部分很了解,所以从技术上讲,它们都是一样的。在
ByteArraySerializer
中,我们必须自己转换它,仅此而已?除此之外,没有其他区别,对吗?我看不出这两者之间有任何明显的区别。