先来看看现象:

这是用工具ZooInspector查看zookeeper上的数据显示的结果,从图中可以看出,数据的前几个字节是乱码。

 

pom.xml中的zookeeper依赖:

       <!-- zookeeper -->
	    <dependency>
		     <groupId>org.apache.zookeeper</groupId>
		     <artifactId>zookeeper</artifactId>
		     <version>3.4.12</version>
	 	</dependency>
		<dependency>
		    <groupId>org.apache.curator</groupId>
		    <artifactId>curator-recipes</artifactId>
		    <version>4.0.1</version>
		</dependency>
		
		<dependency>
		    <groupId>com.101tec</groupId>
		    <artifactId>zkclient</artifactId>
		    <version>0.10</version>
		</dependency>

而写入数据代码如下:

public ZkClient zk = new ZkClient(zkAddr);

if(!zk.exists("/abc/servers")){
			zk.createPersistent("/abc/servers", true);
}

zk.writeData("/abc/servers", data);

无论写入的数据是否是中文,都会出现乱码。

 

解决的方法:

新建一个MyZkSerializer类,实现了ZkSerializer接口,里面的内容如下:

public class MyZkSerializer implements ZkSerializer
{
	 	@Override
	    public Object deserialize(byte[] bytes) throws ZkMarshallingError {
	        	return new String(bytes, Charset.forName("UTF-8"));
	    }
	 	
	    @Override
	    public byte[] serialize(Object serializable) throws ZkMarshallingError {
	        	return ((String)serializable).getBytes(Charset.forName("UTF-8"));
	    }
}

然后在client写入数据之前,添加一行代码:

zk.setZkSerializer(new MyZkSerializer());

这样就不会出现乱码了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐