Nextgen Proto Pythonic API: “Add-on” proto for serialize/parse

- add google.protobuf.proto module
- wrap generated SerializeToString and ParseFromString to the new module:

def serialize(message: Message, deterministic: bool=None) -> bytes:
        """Return the serialized proto."""
def parse(message_class: typing.Type[Message], payload: bytes) -> Message:
        """Given a serialized proto, deserialize it into a Message."""

PiperOrigin-RevId: 632223409
pull/16792/head
Jie Luo 2024-05-09 11:51:48 -07:00 committed by Copybara-Service
parent 82e83ddc95
commit 495ba7bcdb
2 changed files with 73 additions and 0 deletions

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Protocol Buffers - Google's data interchange format
# Copyright 2008 Google Inc. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
"""Tests Nextgen Pythonic protobuf APIs."""
import unittest
from google.protobuf import proto
from google.protobuf.internal import test_util
from google.protobuf.internal import testing_refleaks
from google.protobuf.internal import _parameterized
from google.protobuf import unittest_pb2
from google.protobuf import unittest_proto3_arena_pb2
@_parameterized.named_parameters(('_proto2', unittest_pb2),
('_proto3', unittest_proto3_arena_pb2))
@testing_refleaks.TestCase
class ProtoTest(unittest.TestCase):
def testSerializeParse(self, message_module):
msg = message_module.TestAllTypes()
test_util.SetAllFields(msg)
serialized_data = proto.serialize(msg)
parsed_msg = proto.parse(message_module.TestAllTypes, serialized_data)
self.assertEqual(msg, parsed_msg)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,39 @@
# Protocol Buffers - Google's data interchange format
# Copyright 2008 Google Inc. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
"""Contains the Nextgen Pythonic protobuf APIs."""
import typing
from google.protobuf.message import Message
def serialize(message: Message, deterministic: bool=None) -> bytes:
"""Return the serialized proto.
Args:
message: The proto message to be serialized.
deterministic: If true, requests deterministic serialization
of the protobuf, with predictable ordering of map keys.
Returns:
A binary bytes representation of the message.
"""
return message.SerializeToString(deterministic=deterministic)
def parse(message_class: typing.Type[Message], payload: bytes) -> Message:
"""Given a serialized data in binary form, deserialize it into a Message.
Args:
message_class: The message meta class.
payload: A serialized bytes in binary form.
Returns:
A new message deserialized from payload.
"""
new_message = message_class()
new_message.ParseFromString(payload)
return new_message