网络通讯中常用protobuf对结构化数据作序列化,如将 Usr 对象序列化成字符串类型,使用protobuf的SerializeToString函数,这个函数以下:
web
bool SerializeToString(string* output) const//序列化消息,字节保存在string中。注意字节是二进制,而非文本;
hiredis使用redisCommand函数存储和访问数据,若是直接使用redisCommand(_ctx, "SET %s %s", key.c_str(), value.c_str())保存value的值有可能致使数据不完整,缘由是pb序列化以后的string中保存的是二进制数据,可能致使c_str()方法返回的c字符串被二进制0值截断,形成数据不完整。
redis
解决的办法:网络
hiredis提供了%b,做为格式化二进制的方法,二进制数据须要提供起始地址和长度。函数
redisCommand(_ctx, "SET %s %b", key.c_str(), value.data(), value.length());
spa