如何在每个 while 循环中初始化 rapidjson 缓冲区?

how do I initialize rapidjson buffer at each while loop?

我目前正在将名为 databuf 的数组类型 rapidjson::Value 从 boost 库发送到 websocket。

这是我在每个循环中加载 databuf 的方式。

rapidjson::Value databuf(kArrayType);
databuf.SetArray();

         for (size_t j = 0; j < sizeof(pu8resbuf); j++)
            {   
                if(databuf.IsNull() == true)
                {
                    printf("databuf is null!\n");
                }
                databuf.PushBack(Value().SetInt(pu8resbuf[j]),allocator);
            }
            

然后,我将 databuf 推回另一个名为 payload 的 rapidjson::value 类型数组,并准备字符串以将其发送到 websocket,如下所示。

payload.SetArray();
payload.PushBack(databuf, allocator);

auto raw_key = std::string(std::string("payload-") + std::to_string(m_count_objects/60) + "-" + std::to_string(m_count_objects).c_str());

rapidjson::Value key(raw_key, allocator);
rapidjson::StringBuffer bufferJson;

jsonDocumentDataSending.AddMember(key, payload, allocator);
bufferJson.Clear();

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()));
  messageQ.pop_back();
  databuf.SetArray();
}
                            

以下是我在前端获得的关于来自 websocket 的传入数据包的结果。

如您所见,发送的数据包在每个循环中都变得越来越长,就好像发送缓冲区由于某种原因没有重置。

有人知道我的代码要修复什么吗?

您需要reset the writer

我已经重置了编写器并清除了 bufferJson,如下所示,但没有用。

bufferJson.Clear();
bufferJson.Flush();
                        rapidjson::PrettyWriter<rapidjson::StringBuffer>
 
writer(bufferJson);
writer.Reset(bufferJson);
                        jsonDocumentDataSending.Accept(writer);

对我有用的是在将数据包发送到 websocket 后交换文档,我按如下方式进行。

if(!messageQ.empty())
{                            
      ws_.write(net::buffer(*messageQ.front()));
                            messageQ.pop_back();

    databuf.SetArray();
                     
    Value(kObjectType).Swap(jsonDocumentDataSending);
}