定义一个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()不会删除消息对象本身。