我在C#和C ++上使用RabbitMQ和协议缓冲区。我有5个不同的类,每个类都包含一个字段' ActionType'。根据我想要调用正确函数的动作类型的数量,但是当我从RabbitMQ获取消息时,当我想要反序列化消息时,我不知道消息属于哪个类。有没有办法将消息反序列化/转换为通用对象,或者我可以只获取操作类型的值,然后反序列化消息?
答案 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
获得的消息将是Foo
,Bar
等- 作为适当的。因此,如果virtual
上有abstract
(或OuterMessage
)方法,则可以使用多重性来调用相应的方法:
var obj = Serializer.Deserialize<OuterMessage>(data); // obj could be Foo/Bar/etc
obj.DoTheThing(); // your virtual method