使用 Protobuf 序列化消息的一部分
Serializing part of a message with Protobuf
我正在尝试 serialize/deserialize 使用 Protobuf 的子消息。
这样做的原因是签名。我希望能够签署我的部分信息。为了能够做到这一点,我需要以某种方式对其进行规范化。
如果重要的话,我使用 protbuf 3.0.0-alpha(使用 proto2 语言)和 Python3.4.
示例文件:testp.proto
package my_package;
message my_mess {
message data {
optional uint64 x = 1;
optional uint64 y = 2;
optional uint64 z = 3;
}
optional bytes signature = 4;
}
在这个例子中,我想对消息的数据部分进行签名。因此我只想序列化my_mess.data,签名,将签名放入my_mess.signature,然后序列化完整消息my_mess。
正在编译testp.proto:
$ protoc -I=. --python_out=. testp.proto
[libprotobuf WARNING google/protobuf/compiler/parser.cc:471] No syntax specified for the proto file. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)
我注意到 mm.data 有方法 SerializeToString 和 SerializePartialToString。
但是,似乎无法直接 运行 它们。这是我的尝试:
$ ipython
In [1]: import testp_pb2
In [2]: mm = testp_pb2.my_mess()
In [3]: mm.data.x = 1
In [4]: mm.data.y = 2
In [5]: mm.data.z = 3
In [6]: mm.data.SerializeToString()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-faa8e25906ca> in <module>()
----> 1 mm.data.SerializeToString()
TypeError: SerializeToString() missing 1 required positional argument: 'self'
In [7]: mm.data.SerializePartialToString()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-4b2c1ff0b1c9> in <module>()
----> 1 mm.data.SerializePartialToString()
TypeError: SerializePartialToString() missing 1 required positional argument: 'self'
我想知道是否缺少一些简单的解决方案。如果您有想法以一种优雅的方式仅签署消息的一部分,我愿意接受其他建议。
感谢您的帮助。
你应该这样声明:
package my_package;
message my_mess {
message data {
optional uint64 x = 1;
optional uint64 y = 2;
optional uint64 z = 3;
}
optional data a_data = 1;
optional bytes signature = 4;
}
表示声明了嵌套的消息类型data
,并在消息my_mess
.
中声明了该类型的字段a_data
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import testp_pb2
>>> mm = testp_pb2.my_mess()
>>> mm.a_data.x = 1
>>> mm.a_data.y = 2
>>> mm.a_data.z = 3
>>> mm.a_data.SerializeToString()
'\x08\x01\x10\x02\x18\x03'
所以,SerializeToString()
有效。
我在创建 C++ 时遇到了同样的错误 example.I 在我的 .proto 文件中的包声明之前添加了 'syntax = "proto2";' 然后它起作用了。
我正在尝试 serialize/deserialize 使用 Protobuf 的子消息。 这样做的原因是签名。我希望能够签署我的部分信息。为了能够做到这一点,我需要以某种方式对其进行规范化。
如果重要的话,我使用 protbuf 3.0.0-alpha(使用 proto2 语言)和 Python3.4.
示例文件:testp.proto
package my_package;
message my_mess {
message data {
optional uint64 x = 1;
optional uint64 y = 2;
optional uint64 z = 3;
}
optional bytes signature = 4;
}
在这个例子中,我想对消息的数据部分进行签名。因此我只想序列化my_mess.data,签名,将签名放入my_mess.signature,然后序列化完整消息my_mess。
正在编译testp.proto:
$ protoc -I=. --python_out=. testp.proto
[libprotobuf WARNING google/protobuf/compiler/parser.cc:471] No syntax specified for the proto file. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)
我注意到 mm.data 有方法 SerializeToString 和 SerializePartialToString。 但是,似乎无法直接 运行 它们。这是我的尝试:
$ ipython
In [1]: import testp_pb2
In [2]: mm = testp_pb2.my_mess()
In [3]: mm.data.x = 1
In [4]: mm.data.y = 2
In [5]: mm.data.z = 3
In [6]: mm.data.SerializeToString()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-faa8e25906ca> in <module>()
----> 1 mm.data.SerializeToString()
TypeError: SerializeToString() missing 1 required positional argument: 'self'
In [7]: mm.data.SerializePartialToString()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-4b2c1ff0b1c9> in <module>()
----> 1 mm.data.SerializePartialToString()
TypeError: SerializePartialToString() missing 1 required positional argument: 'self'
我想知道是否缺少一些简单的解决方案。如果您有想法以一种优雅的方式仅签署消息的一部分,我愿意接受其他建议。
感谢您的帮助。
你应该这样声明:
package my_package;
message my_mess {
message data {
optional uint64 x = 1;
optional uint64 y = 2;
optional uint64 z = 3;
}
optional data a_data = 1;
optional bytes signature = 4;
}
表示声明了嵌套的消息类型data
,并在消息my_mess
.
a_data
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import testp_pb2
>>> mm = testp_pb2.my_mess()
>>> mm.a_data.x = 1
>>> mm.a_data.y = 2
>>> mm.a_data.z = 3
>>> mm.a_data.SerializeToString()
'\x08\x01\x10\x02\x18\x03'
所以,SerializeToString()
有效。
我在创建 C++ 时遇到了同样的错误 example.I 在我的 .proto 文件中的包声明之前添加了 'syntax = "proto2";' 然后它起作用了。