2013-04-05 87 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 
} 
相关问题