2013-04-05 92 views
0

我正在使用極其模塊化的系統。消息可以由src,dest,type的三元組來確定。使用Google協議緩衝區多次反序列化消息

我正在研究用Protocol Buffers重新實現我們的消息。我已經通過Protocol buffer polymorphismwhat's the right way to do polymorphism with protocol buffers?http://www.indelible.org/ink/protobuf-polymorphism/

什麼我不知道有沒有人實現解決方案讀取其中:

message header { 
    required string src = 1 
    required string dest = 2 
    required string type = 3 
} 

和創建單獨的郵件,其中:

message foo { 
    required header h = 1 
    required string a = 2 
} 

獨立文件:

message bar { 
    required header h = 1 
    required uint32 num = 2 
} 

在接收代碼有類似的東西:

Message.ParseFromString(msgStr) 
if (Message.type == foo) 
{ 
    FooMessage.ParseFromString(msgStr) 
} 
else { 
    BarMessage.ParseFromString(msgStr) 
} 

如果這種方法已被使用,是否比上述鏈接中描述的更好或更差?

回答

2

我發現的唯一方法是將消息主體序列化/反序列化爲字節數組。然後你會得到抽象的所需級別:

message header { 
    required string src = 1; 
    required string dest = 2; 
    required string type = 3; 
} 

message foo { 
    required string a = 2; 
} 

message bar { 
    required uint32 num = 2; 
} 

message request { 
    required header h; 
    required bytes data; // serialize foo or bar here 
} 

那麼你的代碼將是這樣的(這是一個僞代碼):

request req = request.ParseFromString(buffer); 

if (req.h().type() == "foo") { 
    foo msg = foo.ParseFromString(req.data); 
    // process foo msg 
} 
else if (req.h().type() == "bar") { 
    bar msg = bar.ParseFromString(req.data); 
    // process bar msg 
} 
相關問題