Python сериализация pb3 с использованием pb3 - PullRequest
0 голосов
/ 27 мая 2020

Я использую 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, но не знаю, как его использовать.

Например, если я хочу использовать Маршалла метка времени в байтах, как я могу это сделать?

1 Ответ

0 голосов
/ 27 мая 2020

Со ссылкой на Раздел 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

Ссылки:

...