我是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)
返回true
,buffer.empty()
返回false
。
required
个字段。
用例会发生什么:
proto2
使用Protobuf v3编译器编译的消息。此消息以部分填充的必填字段结束,并将发送到Protobuf v2 enpoint,强制执行required
字段。这是否实际上意味着只发送了无字节的字节,因为该消息无效并将被拒绝?
我应该从v3.2.0降级到2.x以禁止在客户端发送不完整的消息吗?
答案 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,必填字段的概念是错误'。