使用pb3的Python pb3序列化

问题描述 投票:0回答:1

我正在使用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文件,但不知道如何使用。

例如,如果我想将时间戳记编组为字节,我该怎么办?

python-3.x protocol-buffers proto proto3
1个回答
0
投票

参考The Protocol Buffer API部分:

与生成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

参考:

© www.soinside.com 2019 - 2024. All rights reserved.