2013-04-05 3 views
0

Я работаю с очень модульной системой. Сообщения могут быть определены с помощью 3-х кортежей src, dest, type.Повторное удаление сообщения с помощью буферов протокола Google

Я изучаю переопределение наших сообщений с помощью протокольных буферов. Я прочитал Protocol buffer polymorphism, what'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 
} 
Смежные вопросы