aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJie Luo <jieluo@google.com>2024-05-09 11:51:48 -0700
committerCopybara-Service <copybara-worker@google.com>2024-05-09 11:53:56 -0700
commit495ba7bcdbd806306f0dfab128b2081c17fd66fd (patch)
tree91da55c5192a9e58aa6548b34f936c408bcd118c
parent82e83ddc95330bbd988ba874ea5aa37d343d4490 (diff)
downloadprotobuf-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.py34
-rw-r--r--python/google/protobuf/proto.py39
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