【问题标题】:how do I initialize rapidjson buffer at each while loop?如何在每个 while 循环中初始化 rapidjson 缓冲区?
【发布时间】:2021-12-23 20:23:16
【问题描述】:

我目前正在将名为 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 的传入数据包的结果。

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

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

【问题讨论】:

    标签: c++ arrays json rapidjson


    【解决方案1】:

    你需要reset the writer

    【讨论】:

    • 请多解释。链接包含什么?你如何重置作家?您的帖子目前只不过是一条评论。
    • @Dharman 它链接到相关文档
    • 请展示如何将此建议应用于代码。 edit帖子提供更多解释。
    • 我已经在下面发布了对我有用的内容:)
    【解决方案2】:

    我已经像下面一样重置了 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2023-04-02
      • 2011-07-12
      相关资源
      最近更新 更多