未检查/强制执行Protobuf C ++必填字段

时间:2017-05-17 06:44:40

标签: c++ protocol-buffers

我是Protocol Buffers的新手,目前我看到了以下问题:

我们在Protocol Buffers 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以禁止在客户端发送不完整的消息吗?

2 个答案:

答案 0 :(得分:4)

我出现了以前监督过的文件:

Standard Message Methods并且有以下文档:

  

标准消息方法

     

每个消息类还包含许多其他方法,可让您检查或操作整个消息,包括:

     

{!! Form::model($ads, ['route' => ['company.update', $ads->id], 'method' => "PUT", 'files' => true]) !!} <input type="hidden" name="company_id" value ="@foreach ($companies as $company){{ $company->id }}@endforeach"> //the rest of the codes {!! Form::close() !!} :检查是否已设置所有必填字段。

这就是我需要的! Protobuf再次伟大!

答案 1 :(得分:2)

  

是否有设置或任何类型的配置开关,我可以使用Protobuf v3强制执行这些检查?

您是否尝试在调试配置中构建protobuf?我想你会发现它会在这种情况下断言。

  

用例会发生什么:

     

proto2使用Protobuf v3编译器编译的消息。此消息以部分填充的必填字段结束,并将发送到Protobuf v2 enpoint,后者强制执行必填字段。这是否有效地意味着只有没有发送的字节,因为消息无效并且会被拒绝?

在这种情况下,接收方可以ParsePartialFromXXX接收发送的内容。他可以使用message.has_xxx()

测试邮件的有效性
  

我应该从v3.2.0降级到2.x以禁止在客户端发送不完整的消息吗?

我不会。也许为每种消息类型编写一个检查器来断言每个必需字段都存在。更好的是,将它视为proto3方式并将丢失的字段视为接收器中的默认值。 protobuf文档建议永远不要将required字段添加到现有消息类型中,并建议在创建字段required之前“仔细思考”。您可以将其视为'oops,必填字段的概念是错误'。