使用协议缓冲区

时间:2018-06-13 05:25:50

标签: c# c++ protocol-buffers

我在C#和C ++上使用RabbitMQ和协议缓冲区。我有5个不同的类,每个类都包含一个字段' ActionType'。根据我想要调用正确函数的动作类型的数量,但是当我从RabbitMQ获取消息时,当我想要反序列化消息时,我不知道消息属于哪个类。有没有办法将消息反序列化/转换为通用对象,或者我可以只获取操作类型的值,然后反序列化消息?

1 个答案:

答案 0 :(得分:1)

在protobuf术语中,这听起来像oneof场景,有5个子消息。 oneof将为您提供鉴别器枚举和5条消息。含义:

message OuterMesage {
    oneof actionType {
        Foo foo = 1;
        Bar bar = 2;
        ...
    }
}
message Foo {...}
message Bar {...}
...

您将数据反序列化为OuterMesage,并通过.actionTypeCase(通常位于switch)查看.foo / .bar等内容

请注意,如果你正在使用protobuf-net,这个完全相同的场景也可以建模为继承,允许使用多态;即。

[ProtoContract]
[ProtoInclude(1, typeof(Foo)]
[ProtoInclude(2, typeof(Bar)]
public class OuterMessage { ... }

[ProtoContract]
public class Foo : OuterMessage {}

[ProtoContract]
public class Bar : OuterMessage {}

这实际上是完全相同的数据布局,但现在您从反序列化OuterMessage获得的消息将是FooBar等- 作为适当的。因此,如果virtual上有abstract(或OuterMessage)方法,则可以使用多重性来调用相应的方法:

var obj = Serializer.Deserialize<OuterMessage>(data); // obj could be Foo/Bar/etc
obj.DoTheThing(); // your virtual method