protobuf repeated 怎么用的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了protobuf repeated 怎么用的相关的知识,希望对你有一定的参考价值。
protobuf是Google开发的一个序列化框架,类似XML,JSON,基于二进制,比传统的XML表示同样一段内容要短小得多。通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列化与反序列化。protobuf repeated类型相当于std的vector,可以用来存放N个相同类型的内容,文章将简单介绍protobuf repeated的使用。首先定义一个protobuf结构,如下:
message Person
required int32 age = 1;
required string name = 2;
message Family
repeated Person person = 1;
下面我们以例子简单说明如何使用:
int main(int argc, char* argv[])
GOOGLE_PROTOBUF_VERIFY_VERSION;
Family family;
Person* person;
// 添加一个家庭成员,John
person = family.add_person();
person->set_age(25);
person->set_name("John");
// 添加一个家庭成员,Lucy
person = family.add_person();
person->set_age(23);
person->set_name("Lucy");
// 添加一个家庭成员,Tony
person = family.add_person();
person->set_age(2);
person->set_name("Tony");
// 显示所有家庭成员
int size = family.person_size();
cout << "这个家庭有 " << size << " 个成员,如下:" << endl;
for(int i=0; i<size; i++)
Person psn = family.person(i);
cout << i+1 << ". " << psn.name() << ", 年龄 " << psn.age() << endl;
getchar();
return 0;
参考技术A Protobuf中RepeatedPtrField不能直接放在vector容器中
比如下面的用法是错误的,原因是push_back的时候会调用 operator =,
而在protobuf2.3中, operator = 在RepeatedPtrField中是private的。本回答被提问者和网友采纳
python基础---protobuf的使用(还未完成)
python基础–protobuf的使用(一)
在上一篇博客中,我们了解了如何安装protobuf,以及写了2个例子,来了解如何利用protobuf规则进行数据的序列化和范序列化
这篇博客我们就继续写几个例子,来了解下protobuf规则,然后在结合前端进行简单交互
repeated规则
以下是百度翻译的谷歌protobuf官方文档
可以自行查阅https://developers.google.com/protocol-buffers/docs/reference/python-generated#extension
Repeated Fields
重复字段表示为像Python序列那样的对象。与嵌入消息一样,不能直接分配字段,但可以操作它
message Foo
repeated int32 nums = 1;
Repeated Message Fields
重复消息类似于重复标量字段,但相应的Python对象不具有AppEnter()函数。相反,它有一个Ad()函数,它创建一个新的消息对象,将其附加到列表中,并返回给调用者填写。它还有一个扩展()函数,它附加了一个完整的消息列表,但是复制了列表中的每个消息。这样做使得消息总是由父消息所拥有,以避免循环引用和当可变数据结构拥有多个所有者时可能发生的其他混淆。
message Foo
repeated Bar bars = 1;
message Bar
int32 i = 1;
int32 j = 2;
我们来看一个完整的例子
python_proto.proto
syntax = "proto3";
package proto_;
message Foo
//普通属性
string foo_name = 1;
//嵌套message
message Bar
string bar = 1;
//列表
repeated int32 nums = 2;
//列表1
repeated BarMsg bars = 3;
//列表1
message BarMsg
int32 i = 1;
int32 j = 2;
然后通过protoc ./python_proto.proto --python_out=./
编译
python_proto.py
from proto_ import python_proto_pb2
#第一种方式添加BarMsg : Repeated Message
foo = python_proto_pb2.Foo(
bars = [
python_proto_pb2.BarMsg(i=7777111,j=92323232)
]
)
#普通属性
foo.foo_name = "safly"
#列表nums :Repeated Fields
foo.nums.append(15)
foo.nums.extend([32, 47])
foo.nums[0] = 123
foo.nums.insert(0,34343)
bar = python_proto_pb2.Foo.Bar
bar.bar_name = "bar_anme"
#列表1Repeated Message Fields
bar_msg = foo.bars.add()
bar_msg.i = 123
#也可以按着如下的方式添加
foo.bars.add(i=999999,j=42342444)
#列表2另外的方式
bar_msg_extend = python_proto_pb2.BarMsg()
bar_msg_extend.i = 234
bar_msg_extend.j = 456
foo.bars.extend([bar_msg_extend])
serializeToString = foo.SerializeToString()
foo.ParseFromString(serializeToString)
print(foo.foo_name)
print(foo.Bar.bar_name)
for i in foo.nums:
print(i)
for i in foo.bars:
print(i.i)
#修改
foo.bars[1].i = 97979
for i in foo.bars:
print(i.i)
输出如下:
/Users/zhiliao/miniconda3/bin/python /Users/zhiliao/zhiliao/untitled1/proto_/python_proto.py
safly
bar_anme
34343
123
32
47
7777111
123
999999
234
7777111
97979
999999
234
Process finished with exit code 0
以上是关于protobuf repeated 怎么用的的主要内容,如果未能解决你的问题,请参考以下文章
lua 中protobuf repeated 嵌套类 复合类型
unity protobuf使用repeated字段转c#文件后List只读问题