diff --git a/python/google/protobuf/internal/proto_test.py b/python/google/protobuf/internal/proto_test.py new file mode 100644 index 000000000000..6bf5b5447188 --- /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 000000000000..722bbb23fc04 --- /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