object
довольно неловко, потому что у двигателя нет возможности узнать, что вы собираетесь. - это некоторые вещи динамического типа, встроенные в protobuf-net, в которые встроен тип AQN, но, честно говоря, это огромный взлом.Безусловно, ваш лучший выбор - ограничить себя некоторой ограниченной моделью наследования.Например:
[ProtoContract]
[ProtoInclude(1, typeof(Foo)]
[ProtoInclude(2, typeof(Bar)]
public class MessageBase {}
с
[ProtoContract]
public class Foo : MessageBase {}
(и аналогично Bar
)
Затем отправьте MessageBase[]
и используйте Deserialize
(или DeserializeWithLengthPrefix
) указав <MessageBase>
.Каждое сообщение будет отправлено и получено как правильный тип, разрешающий либо полиморфизм, либо новое switch
сопоставление с образцом, которое будет использоваться для маршрутизации входящих сообщений, и нет никакой двусмысленности.
За кадром этореализовано как (в терминах .proto):
message MessageBase {
oneof ActualType {
Foo foo = 1;
Bar bar = 2;
}
}
message Foo {}
message Bar {}