使用pb3的Python pb3序列化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用pb3的Python pb3序列化相关的知识,希望对你有一定的参考价值。
我正在使用pb3进行序列化:
syntax = "proto3";
package marshalling;
import "google/protobuf/timestamp.proto";
message PrimitiveType {
oneof primitive_value {
bool boolean_value = 1;
int64 int_value = 2;
double double_value = 3;
google.protobuf.Timestamp timestamp_value = 4;
}
}
我生成了一个x_pb2.py
文件,但不知道如何使用。
例如,如果我想将时间戳记编组为字节,我该怎么办?
与生成Java和C ++协议缓冲区代码时不同,Python协议缓冲区编译器不会直接为您生成数据访问代码。相反,它为您的所有消息,枚举和字段以及一些神秘的空类生成特殊的描述符,每种消息类型一个...
和
在加载时,
GeneratedProtocolMessageType
元类使用指定的描述符来创建您需要使用每种消息类型的所有Python方法,并将它们添加到相关的类中。然后,您可以在代码中使用完全填充的类。因此,您可以使用生成的类来创建对象及其字段,如下所示:
p1 = primitive_types_pb2.PrimitiveType() p1.int_value = 1234
对于您的用例,可以使用timestamp_pb2.Timestamp.GetCurrentTime()。
或者,您可以与Timestamp一起参考timestamp_pb2.Timestamp.CopyFrom():
now = time.time() seconds = int(now) nanos = int((now - seconds) * 10**9) timestamp = Timestamp(seconds=seconds, nanos=nanos) p1 = primitive_types_pb2.PrimitiveType() p1.timestamp_value.CopyFrom( timestamp )
[您可能会对其他用例感兴趣的其他google.protobuf.timestamp_pb2 API。
这是一个完整的工作示例(primitive_types.proto
):
import time # For Timestamp.CopyFrom(). See commented code below import primitive_types_pb2 from google.protobuf import timestamp_pb2 # serialization p1 = primitive_types_pb2.PrimitiveType() # Alternative to GetCurrentTime() # now = time.time() # seconds = int( now ) # nanos = int( (now - seconds) * 10**9 ) # timestamp = timestamp_pb2.Timestamp( seconds=seconds, nanos=nanos ) # p1.timestamp_value.CopyFrom( timestamp ) p1.timestamp_value.GetCurrentTime() serialized = p1.SerializeToString() # deserialization p2 = primitive_types_pb2.PrimitiveType() p2.ParseFromString( serialized ) print( p2.timestamp_value )
输出:
seconds: 1590581054 nanos: 648958000
参考:
- https://developers.google.com/protocol-buffers/docs/proto3#oneof
- https://developers.google.com/protocol-buffers/docs/pythontutorial
- https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#timestamp
- https://googleapis.dev/python/protobuf/latest/google/protobuf/timestamp_pb2.html
以上是关于使用pb3的Python pb3序列化的主要内容,如果未能解决你的问题,请参考以下文章
GPIO初始化之PB3/PB4/PA13/PA14/PA15引脚的复用--寄存器版本
STM32的PB3口不能拉低 PB4口不能拉高 其他口貌似都可以 怎么会
STM32C8T6 JTAG使用到PB3|PB4|PA13|PA14|PB15端口做普通IO时,需禁止JTAG!