org.I0Itec.zkclient创建客户端连接时序列化类指定问题
org.I0Itec.zkclient创建客户端连接时序列化类指定问题使用org.I0Itec.zkclient创建ZkClient实例时,若不指定序列化类,会默认使用org.I0Itec.zkclient.serialize.SerializableSerializer,该默认序列化类使用可能有问题,如往zk节点上写data会出现乱码,或Kafka通过方法AdminUtils.createTop
·
org.I0Itec.zkclient创建客户端连接时序列化类指定问题
使用org.I0Itec.zkclient创建ZkClient实例时,若不指定序列化类,会默认使用org.I0Itec.zkclient.serialize.SerializableSerializer,该默认序列化类使用可能有问题,如往zk节点上写data会出现乱码,或Kafka通过方法AdminUtils.createTopic(ZkClient, topic, partitions, replicationFactor, topicConfig)
时,topic下的分区节点创建不了。因此最好自己实现一个序列化类,创建ZkClient实例后通过setZkSerializer()方法配置自己写的序列化实现。
zkclient实例创建
ZkClient client = new ZkClient("IP:PORT", sessionTimeout, connectionTimeout);
public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout) {
this(new ZkConnection(zkServers, sessionTimeout), connectionTimeout);
}
//这里使用默认的SerializableSerializer()
public ZkClient(IZkConnection connection, int connectionTimeout) {
this(connection, connectionTimeout, new SerializableSerializer());
}
ZkSerializer接口
类SerializableSerializer实现接口ZkSerializer
public interface ZkSerializer {
//序列化,将对象转为字节码
public byte[] serialize(Object data) throws ZkMarshallingError;
//反序列化,将字节码转为对象
public Object deserialize(byte[] bytes) throws ZkMarshallingError;
}
定义自己的序列化类,使用UTF-8编码
public class MyZkSerializer implements ZkSerializer
{
public Object deserialize(byte[] bytes) throws ZkMarshallingError
{
return new String(bytes, Charsets.UTF_8);
}
public byte[] serialize(Object obj) throws ZkMarshallingError
{
return String.valueOf(obj).getBytes(Charsets.UTF_8);
}
}
创建ZkClient实例后配置序列化实现,不使用默认的
ZkClient client = new ZkClient("IP:PORT", sessionTimeout, connectionTimeout);
client.setZkSerializer(new MyZkSerializer());
更多推荐
已为社区贡献4条内容
所有评论(0)