遇到了这样一个场景:
我需要使用消息队列将一个object发送出去;
但是公司的kafka只支持接受String(具体原因很复杂,但是这个是绕不过去的)。
现在就有了这么几个方案
- 直接使用json序列化
- 使用序列化产品进行序列化(hessian,Kryo)等
验证之后发现直接json的性能实在是太差了,耗时长且占CPU。
所以优化的方向变成了使用序列化协议进行序列化;
但是序列化出来的一定都是byte流而不是字符串,发送出去时需要再编码成字符串;
这里最初使用的是new String(bytes, StandardCharsets.UTF_8)
这种方法。
问题有:
- 序列化结果中会有UTF_8中不包含的比特组合;java会将这些bit丢弃,导致得到的消息无法反序列化
- 由于UTF_8是变长编码,所以慢的令人发指
之后想到了使用base64;可以胜任但是耗时还是有一些长;
最后发现了ISO_8859_1 这个编码集;定长编码所以速度快& 全覆盖所以不会丢bit,使用它将byte转字符串的速度是base64的五十倍,uft-8的500倍!