zkclient出现StreamCorruptedException报错的解决方法

使用org.I0Itec.zkclient创建ZkClient实例时,若不指定序列化类,会默认使用org.I0Itec.zkclient.serialize.SerializableSerializer。如果读取zk节点上的数据会出现StreamCorruptedException报错或者往zk节点上写data会出现乱码,可以考虑下重写默认序列化类。

报错图如下:

出现StreamCorruptedException报错

排查思路

zkclient实例创建代码如下:

public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout) {
        this((IZkConnection)(new ZkConnection(zkServers, sessionTimeout)), connectionTimeout);
    }

再往下看会发现构造函数使用了默认的SerializableSerializer()

public ZkClient(IZkConnection connection, int connectionTimeout) {
        this(connection, connectionTimeout, new SerializableSerializer());
    }

类SerializableSerializer实现接口ZkSerializer。接口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, Charset.forName("UTF-8"));
    }

    public byte[] serialize(Object obj) throws ZkMarshallingError
    {
        return String.valueOf(obj).getBytes(Charset.forName("UTF-8"));
    }
}

创建ZkClient实例后配置序列化实现,不使用默认的构造函数

ZkClient client = new ZkClient("IP:PORT", sessionTimeout, connectionTimeout);   
client.setZkSerializer(new MyZkSerializer());

这样就不会报错了~

哎呀,如果我的名片丢了。微信搜索“全菜工程师小辉”,依然可以找到我

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值