protobuf发送方对message赋值,但接收方判断has_message为0的原因

定义一个proto文件

package WORK;
message Education
{
int degree = 1;
string school = 2;
}
message Persion
{
bool sex = 1;
Uint32 age = 2;
Education education = 3;
}

创建一个Persion对象(正确方式

WORK::Persion persion;
persion.Clear();	
WORK::Education *edu = persion.mutable_education();
//注意Clear()的位置,上面的代码是正确的,但是如果放在本行,则会导致edu->set_degree(1);后,接收端判断has_education()返回0

错误方式

WORK::Persion persion;
WORK::Education *edu = persion.mutable_education();
persion.Clear();

这是因为Clear()方法会将消息重置为初始状态,如字段重置为默认值,释放动态分配内存,清除未知字段。但Clear()不会删除消息对象本身。

C++中给一个message的google.protobuf.Any成员赋值,需要按照以下步骤进行: 1.首先,需要在.proto文件中定义消息格式,包括google.protobuf.Any类型的字段。例如: ```protobuf syntax = "proto3"; package test; import "google/protobuf/any.proto"; message MyMessage { int32 id = 1; google.protobuf.Any data = 2; } ``` 2.使用protoc编译器生成相应的C++代码。在终端中输入以下命令: ```shell protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/my_proto.proto ``` 其中,$SRC_DIR是.proto文件所在的目录,$DST_DIR是生成的C++代码存放的目录。 3.在C++代码中使用protobuf API写入和读取消息。给一个message的google.protobuf.Any成员赋值的具体步骤如下: ```c++ // 创建一个MyMessage对象 MyMessage message; // 创建一个要嵌入到google.protobuf.Any中的消息对象 Message2 message2; message2.set_id(123); message2.set_name("test"); // 将消息对象序列化为字节流 std::string serialized_message2; message2.SerializeToString(&serialized_message2); // 将字节流封装到google.protobuf.Any中 google::protobuf::Any any; any.set_type_url("type.googleapis.com/test.Message2"); any.set_value(serialized_message2); // 将google.protobuf.Any赋值给MyMessage中的google.protobuf.Any成员 message.set_allocated_data(&any); ``` 在上述代码中,我们首先创建了一个MyMessage对象,然后创建了一个要嵌入到google.protobuf.Any中的消息对象Message2,并将其序列化为字节流。接着,我们创建了一个google.protobuf.Any对象,并将字节流封装到其中。最后,我们将google.protobuf.Any对象赋值给MyMessage中的google.protobuf.Any成员。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值