如何更改Google的protobuf中的缓冲区限制?

Moh*_*imi 10 c++ protocol-buffers

当我尝试解析一条大邮件时,我收到此警告并出现错误.我知道64MB是默认限制.我现在正在使用message.ParseFromIstream.有没有人知道访问CodedInputStream对象来调用SetTotalBytesLimit函数?或任何其他方式来解决这个问题?

阅读危险的大型协议消息.如果消息结果大于67108864字节,则出于安全原因,将停止解析.要增加限制(或禁用这些警告),请参阅google/protobuf/io/coded_stream.h中的CodedInputStream :: SetTotalBytesLimit().

Voo*_*Voo 9

只要阅读错误已经告诉过你的函数的文档,就会回答这个问题:

提示:如果您正在阅读此内容,因为您的程序正在打印有关危险大型协议消息的警告,您可能会对下一步该做什么感到困惑.最好的选择是更改您的设计,以便不需要过大的消息.例如,尝试将文件格式设计为包含许多小消息而不是单个大消息.如果这是不可行的,则需要增加限制.但是,您的代码可能永远不会构造可以设置限制的CodedInputStream.您可能通过调用Message :: ParseFromString()之类的东西来解析消息.在这种情况下,您需要更改代码以构造某种ZeroCopyInputStream(例如ArrayInputStream),围绕它构造CodedInputStream,然后调用Message :: ParseFromCodedStream().然后你可以调整限制.是的,这是更多的工作,但你正在做一些不寻常的事情.

资源

另外,遵循建议的第一部分并重新设计应用程序可能是一个非常好的主意.


joy*_*epb 9

正确的解决方法:您应该尝试限制protobuf消息的大小.请参阅:https: //developers.google.com/protocol-buffers/docs/techniques#streaming

快速和肮脏的(读不推荐)的方法:在protobuf的库源文件coded_stream.h,改变的价值观kDefaultTotalBytesLimitkDefaultTotalBytesWarningThreshold,重新编译,并重新安装.

  • 您可以手动构建CodedInputStream并使用该代码,而不是建议管理您自己的protobuf代码分支(ugh).重新设计应用程序很可能是最好的选择,但绝对没有理由维护自己的分支. (2认同)