В терминах 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