python基础---protobuf的使用(还未完成)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013210620/article/details/81356661

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

猜你喜欢

转载自blog.csdn.net/u013210620/article/details/81356661
今日推荐