我正在使用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
参考: