序列化对象
package com.oldwang.custom_serializer;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
序列化实现类
package com.oldwang.custom_serializer;
import org.apache.kafka.common.serialization.Serializer;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Map;
public class CustomUserSerializer implements Serializer<User> {
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
}
@Override
public byte[] serialize(String topic, User data) {
if(data == null){
return null;
}
byte[] id,name;
try {
if(data.getName() != null) {
name = data.getName().getBytes("UTF-8");
}else {
name = new byte[0];
}
if(data.getId() >= 0){
id = (data.getId()+"").getBytes("UTF-8");
}else {
id = new byte[0];
}
ByteBuffer buffer = ByteBuffer.allocate(4+4+name.length+id.length);
buffer.putInt(id.length);
buffer.put(id);
buffer.putInt(name.length);
buffer.put(name);
return buffer.array();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new byte[0];
}
@Override
public void close() {
}
}
producer生产者
package com.oldwang.custom_serializer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class CustomSerializerProducer {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,CustomUserSerializer.class.getName());
KafkaProducer<String, User> producer = new KafkaProducer<>(properties);
Future<RecordMetadata> future = producer.send(new ProducerRecord<>("user", new User(1, "oldwang")));
String topic = future.get().topic();
System.out.println(topic);
producer.close();
}
}
反序列化实现类
package com.oldwang.custom_serializer;
import org.apache.kafka.common.serialization.Deserializer;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Map;
public class CustomUserDeserializer implements Deserializer<User> {
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
}
@Override
public User deserialize(String topic, byte[] data) {
if (data == null) {
return null;
}
if (data.length < 8){
throw new RuntimeException("data length error");
}
ByteBuffer buffer = ByteBuffer.wrap(data);
int idLen,nameLen;
idLen = buffer.getInt();
byte[] idBytes = new byte[idLen];
buffer.get(idBytes);
nameLen = buffer.getInt();
byte[] nameBytes = new byte[nameLen];
buffer.get(nameBytes);
int id = 0;
String name = null;
try {
id = Integer.parseInt(new String(idBytes,"UTF-8"));
name = new String(nameBytes,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new User(id,name);
}
@Override
public void close() {
}
}
consumer消费者
package com.oldwang.custom_serializer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;
public class CustomSerializerConsumer {
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,CustomUserDeserializer.class.getName());
properties.put(ConsumerConfig.GROUP_ID_CONFIG,"user");
properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
KafkaConsumer<String,User> consumer = new KafkaConsumer<>(properties);
consumer.subscribe(Collections.singleton("user"));
while (true){
ConsumerRecords<String, User> records = consumer.poll(Duration.ofMillis(1000));
records.forEach(record -> {
User user = record.value();
System.out.println(user.toString());
});
}
}
}
效果图
