diff options
author | Jie Luo <jieluo@google.com> | 2024-05-09 11:51:48 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-05-09 11:53:56 -0700 |
commit | 495ba7bcdbd806306f0dfab128b2081c17fd66fd (patch) | |
tree | 91da55c5192a9e58aa6548b34f936c408bcd118c | |
parent | 82e83ddc95330bbd988ba874ea5aa37d343d4490 (diff) | |
download | protobuf-495ba7bcdbd806306f0dfab128b2081c17fd66fd.tar.gz |
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
-rw-r--r-- | python/google/protobuf/internal/proto_test.py | 34 | ||||
-rw-r--r-- | python/google/protobuf/proto.py | 39 |
2 files changed, 73 insertions, 0 deletions
diff --git a/python/google/protobuf/internal/proto_test.py b/python/google/protobuf/internal/proto_test.py new file mode 100644 index 000000000..6bf5b5447 --- /dev/null +++ b/python/google/protobuf/internal/proto_test.py @@ -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() diff --git a/python/google/protobuf/proto.py b/python/google/protobuf/proto.py new file mode 100644 index 000000000..722bbb23f --- /dev/null +++ b/python/google/protobuf/proto.py @@ -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 |