簡體   English   中英

未檢查/強制執行Protobuf C ++必填字段

[英]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)返回truebuffer.empty()false

我知道的

Protobuf v3中刪除了required字段。

我的問題

  • 是否可以使用Protobuf v3強制執行這些檢查的設置或任何類型的配置開關?
  • 用例會發生什么:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM