今天公司服务请求由json改为pb协议。
在使用postman请求二进制文件时发现反序列化失败了,调查了好久,以此记录。
原因是解析请求机制中有这样一段代码:
char* postStr = (char*)malloc(sizeof(char) * request->contentLength() + 1);
io->read(postStr, request->contentLength());
postStr[request->contentLength()] = 0;
postData = postStr;
修改后的代码
char* postStr = (char*)malloc(sizeof(char) * request->contentLength() + 1);
io->read(postStr, request->contentLength());
postStr[request->contentLength()] = 0;
postData = std::string(postStr, request->contentLength());
其中重点在于这里:
postData = std::string(postStr, request->contentLength());
由于char*型数据在赋值给string时如果不指定长度,则会默认以\0截断(ASCII码值为0)。而刚和PB传过来的数据中有字段为0的情况,所以导致此处拿到的数据不全,导致反序列化失败。
详细的测试代码可以参考:
https://blog.csdn.net/analogous_love/article/details/71744427
以此记录,谨记。