proto相关函数用法
如果有一个proto_name
结构的 proto消息:
proto_name.set_xx(value) 该函数给对应的变量赋值
proto_name.add_xx() 该函数给对应的repeated变量增加一个xx类型的元素,返回值为指针类型。一般用法为:在for循环中调用一次,proto消息就添加一个该类型数据。
proto_name.mutable_xxx() 该函数返回指向该字段的一个指针,同时将该字段置为被设置状态。若该对象存在,则直接返回该对象,若不存在则新new 一个。
本文中用到的消息结构:
message PointNameInfo {
optional double longitude = 1;// 经度坐标
optional double latitude = 2;// 纬度坐标
optional uint64 timestamp_sec = 3;// 时间戳
optional uint32 scale = 4;
optional string name = 5;
}
message PointInfo {
optional bool hasPointName = 1;
optional bool hasPointIcon = 2;
optional PointNameInfo point= 3;
optional PointCode pointCode = 4;
}
message SearchResultList {
repeated Point result_points = 1;
}
enum PointCode
{
POINT_CODE_BMD_POINT = 0;
CAR = 1;
COMPASS = 2;
ROAD_NAME = 3;
ROAD_NUMBER = 4;
POI = 5;
}
1.简单(非嵌套)消息内容的赋值
简单的消息内容直接用set_来赋值就行。
赋值方式:
PointNameInfo pointNameInfo;
pointNameInfo.set_name("car");
2.嵌套消息内容的赋值
自己定义的复杂嵌套消息不能够通过简单的set_来赋值,可采取set_allocated和mutable_两种方式,但是二者的赋值方式是不同的。
使用set_allocated_,赋值的对象需要new出来,不能用局部的,因为这里用的的是对象的指针。当局部的对象被销毁后,就会报错。
错误的赋值方式:
1 2 3 4 |
|
使用mutable_,赋值时候,可以使用局部变量,因为在调用的时,内部做了new操作。
赋值方式1(使用set_allocated_):
使用set_allocated_xxx()来设置变量的时候,变量不能是普通栈内存数据,
必须是手动new出来的指针,至于何时delete,就不需要调用者关心了,
protobuf内部会自动delete掉通过set_allocated_设置的内存;
release_xxx()是用来取消之前由set_allocated_xxx设置的数据,
调用release_xxx以后,protobuf内部就不会自动去delete这个数据;
1 2 3 4 |
|
赋值方式2(使用mutable_):
mutable_xxx()返回分配内存后的对象,如果已经分配过则直接返回,如果没有分配则在内部分配,建议使用mutable_xxx
1 2 3 4 |
|
赋值方式3(使用mutable_):
1 2 3 |
|
3.重复消息内容的赋值
带有repeated字段的消息,通过add_依次赋值。
赋值方式:
1 2 3 4 5 6 7 8 9 |
|