簡體   English   中英

使用Protobuf序列化消息的一部分

[英]Serializing part of a message with Protobuf

我正在嘗試使用Protobuf序列化/反序列化子消息。 原因是簽約。 我希望能夠簽署我的部分信息。 為了能夠做到這一點,我需要以某種方式規范它。

如果重要的話,我在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'

我想知道是否有一些我想念的簡單解決方案。 如果您想要以優雅的方式簽署消息的一部分,我願意接受其他建議。

謝謝您的幫助。

我創建一個c ++示例時遇到了同樣的錯誤。我添加了'syntax =“proto2”;' 在我的.proto文件中的包聲明之前然后它可以工作。

你應該這樣聲明:

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 ,和聲明的字段a_data與該類型在消息my_mess

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()可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM