[英]Protobuf C++ required fields are not checked/enforced
我是協議緩沖區的新手,目前我看到以下問題:
我們在協議緩沖區3.2.0庫中使用了proto2
語法,並觀察到在序列化過程中未強制執行required
字段。
這是Catch C ++測試的基本示例:
syntax = "proto2";
package simple_test;
message SimpleMessage
{
required string field1 = 1;
required string field2 = 2;
}
#include "simple.pb.h"
#include <catch.hpp>
#include <string>
SCENARIO("Verify that serialization with missing required fields fails", "[protobuf]")
{
GIVEN("a message")
{
simple_test::SimpleMessage m;
WHEN("field1 is set and field2 is not and both are required")
{
m.set_field1("aaa");
THEN("serializing this message to string buffer must fail")
{
std::string buffer;
CHECK_FALSE(m.SerializeToString(&buffer));
REQUIRE(buffer.empty());
}
}
}
}
m.SerializeToString(&buffer)
返回true
, buffer.empty()
為false
。
Protobuf v3中刪除了required
字段。
用例會發生什么:
proto2
使用Protobuf v3編譯器編譯的消息。 該消息以部分填充的必填字段結束,並將被發送到Protobuf v2 enpoint,它強制執行required
字段。 這是否有效地意味着僅發送了一些字節,因為消息無效並且將被拒絕?
我是否應該從v3.2.0降級到2.x,以禁止在客戶端發送不完整的消息?
我附帶了我以前監督過的這份文檔:
標准消息方法 ,並提供以下文檔:
標准消息方法
每個消息類還包含許多其他方法,可用於檢查或操作整個消息,包括:
bool IsInitialized() const;
:檢查是否已設置所有必填字段。
這就是我所需要的! Protobuf又好了!
是否可以使用Protobuf v3強制執行這些檢查的設置或任何類型的配置開關?
您是否嘗試過在調試配置中構建protobuf? 我想您會發現它在這種情況下會有效。
用例會發生什么:
proto2使用Protobuf v3編譯器編譯的消息。 該消息以部分填充的必填字段結束,並將被發送到Protobuf v2 enpoint,它強制執行必填字段。 這是否有效地意味着僅發送了一些字節,因為消息無效並且將被拒絕?
在這種情況下,接收者可以通過ParsePartialFromXXX
接收發送的內容。 他可以使用message.has_xxx()
測試消息的有效性message.has_xxx()
我是否應該從v3.2.0降級到2.x,以禁止在客戶端發送不完整的消息?
我不會 也許為每種消息類型編寫一個檢查器,以斷言每個必填字段都存在。 更好的是,以proto3的方式考慮它,並將丟失的字段作為接收器中的默認值。 在protobuf的文檔建議從未添加required
的字段到現有的消息類型和制造領域之前,建議“思想非常仔細地” required
。 您可以將其理解為“糟糕,必填字段的概念是一個錯誤”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.