我正在尝试使用Protobuf序列化/反序列化子消息. 原因是签约.我希望能够签署我的部分信息.为了能够做到这一点,我需要以某种方式规范它. 如果重要的话,我在Python3.4中使用protbuf 3.0.0-al
原因是签约.我希望能够签署我的部分信息.为了能够做到这一点,我需要以某种方式规范它.
如果重要的话,我在Python3.4中使用protbuf 3.0.0-alpha(使用proto2语言).
示例文件: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; }
这意味着声明了一个嵌套的消息类型数据,并在消息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()可以工作.