0

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

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

4

1 回答 1

0

参考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

参考:

于 2020-05-27T12:02:58.877 回答