2017-10-10 102 views
0

入門與蟒蛇protobuf的我面臨着一個奇怪的問題:蟒蛇的protobuf無法反序列化消息

一個簡單的消息協議定義是:通過protoc -I . --python_out=generated message.proto產生和Python中訪問像

syntax = "proto3"; 
package test; 

message Message { 
    string message = 1; 
    string sender = 2; 
} 

from generated.message_pb2 import Message 

然後,我可以構造消息

m = Message() 
m.sender = 'foo' 
m.message = 'bar' 

print(str(m)) 

但反序列將不返回結果

s_m = m.SerializeToString() 
print(s_m) # prints fine 
a = m.ParseFromString(s_m) 
a.foo #fails with error - no attributes deserialized 

回答

2

而不是

a = m.ParseFromString(s_m) 
a.foo 

做到這一點

a = m.FromString(s_m) 
print a.sender 

或者你也可以做到這一點

m2 = Message() 
m2.ParseFromString(s_m) 
print m2.sender 

區別在於FromString返回從字符串反序列化的新對象,而ParseFromString解析字符串並設置對象上的字段。