Serializers
前言
如前面的示例所示,生产者配置包括强制序列化器。 我们已经了解了如何使用默认的String序列化程序。 Kafka还包括integers和ByteArrays的序列化程序,但这并不包括大多数用例。 最终,你将希望能够序列化更多通用格式的记录。
我们将首先展示如何编写自己的序列化程序,然后介绍Avro序列化程序作为推荐的替代方案。
自定义序列化器
当你需要发送给Kafka的对象不是简单的字符串或整数时,你可以选择使用Avro,Thrift或Protobuf等通用序列化库来创建记录,或者为已经使用的对象创建自定义序列化。 我们强烈建议使用通用序列化库。 为了理解序列化程序的工作原理以及为什么使用序列化库是个好主意,让我们看看编写自己的自定义序列化程序需要什么。
假设你不是仅记录客户名称,而是创建一个简单的类来表示客户:
public class Customer {
private int customerID;
private String customerName;
public Customer(int ID, String name) {
this.customerID = ID;
this.customerName = name;
}
public int getID() {
return customerID;
}
public String getName() {
return customerName;
} }
现在假设我们要为此类创建自定义序列化程序。 它看起来像这样:
import org.apache.kafka.common.errors.SerializationException;
import java.nio.ByteBuffer;
import java.util.Map;
public class CustomerSerializer implements Serializer<Customer> {
@Override
public void configure(Map configs, boolean isKey) {
// nothing to configure
}
@Override
/**
We are serializing Customer as:
4 byte int representing customerId
4 byte int representing length of customerName in UTF-8 bytes (0 if name is
Null)
N bytes representing customerName in UTF-8
*/
public byte[] serialize(String topic, Customer data) {
try {
byte[] serializedName;
int stringSize;
if (data == null)
return null;
else {
if (data.getName() != null) {
serializeName = data.getName().getBytes(