如何在每次while循环中初始化RapidJSON缓冲区 解决数据包逐次变长问题
问题根因
- 最核心的问题是**
jsonDocumentDataSending对象未重置**:你在每次循环中都调用AddMember方法向这个JSON对象追加新的键值对,但从未清空该对象,导致JSON结构持续累加膨胀,直接表现为发送的报文逐次变长。 - 消息队列操作逻辑错误:你调用
push_back将消息插入队尾,读取队首元素发送后调用pop_back删除队尾元素,会导致队首消息永远残留无法删除,队列持续积压。 - 其他潜在问题:如果
pu8resbuf是指针类型,sizeof(pu8resbuf)得到的是指针本身的字节数(64位系统下为8),不是指向的数组实际长度,会导致序列化的数组内容不符合预期;刚实例化的StringBuffer本身为空,调用Clear()属于冗余操作。
所需修改
- 每次循环构建发送JSON前,调用
SetObject()方法重置jsonDocumentDataSending为空白JSON对象 - 修正消息队列出队操作,发送队首元素后调用
pop_front()而非pop_back() - 如果
pu8resbuf是动态分配的指针,替换sizeof(pu8resbuf)为实际数组长度参数 - 可移除冗余的
bufferJson.Clear()调用
修改后参考代码
// 每轮循环开头先重置JSON文档 jsonDocumentDataSending.SetObject(); rapidjson::Value databuf(kArrayType); // 初始化已指定kArrayType,SetArray可省略 for (size_t j = 0; j < /* 替换为pu8resbuf对应的实际数组长度 */; j++) { if(databuf.IsNull() == true) { printf("databuf is null!\n"); } databuf.PushBack(Value().SetInt(pu8resbuf[j]),allocator); } payload.SetArray(); payload.PushBack(databuf, allocator); auto raw_key = std::string("payload-") + std::to_string(m_count_objects/60) + "-" + std::to_string(m_count_objects); rapidjson::Value key(raw_key, allocator); rapidjson::StringBuffer bufferJson; jsonDocumentDataSending.AddMember(key, payload, allocator); rapidjson::Writer<rapidjson::StringBuffer> writer(bufferJson); jsonDocumentDataSending.Accept(writer); std::string stringForSending = std::string(bufferJson.GetString()); std::shared_ptr<std::string> ss(std::make_shared<std::string>(stringForSending)); messageQ.push_back(ss); if(!messageQ.empty()) { ws_.write(net::buffer(*messageQ.front())); // 改为pop_front删除已发送的队首元素 messageQ.pop_front(); databuf.SetArray(); }
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

