protobuf (при любой реализации) - это просто API-интерфейс сериализации. При разговоре по проводам по умолчанию состоит в том, что оба конца уже согласны с данными. Для отправки различных типов сообщений предлагается несколько вариантов:
- имеет объект-оболочку, который просто имеет дочерние объекты для представления различных типов сообщений. С protobuf-net , в частности , вы также можете напрямую сопоставить это с наследованием (поскольку протокол Probuf-Net сопоставляет наследование с инкапсуляцией)
- используйте заголовок сообщения - какие-то данные перед вашим сообщением, которые идентифицируют это. В частности, если используется стиль префикса
Base128
, вы можете включить номер поля, отправляемого вместе с сообщением (по умолчанию это 1
, но перегруженный метод позволяет вам указать это). Затем вы должны десериализовать это с помощью Serializer.NonGeneric.TryDeserializeWithLengthPrefix
, который включает параметр делегата для выполнения разрешения типа по номеру поля.
После редактирования ... вы упоминаете sendId
и sendName
, но сообщение равно SendNameMessage
. всегда будет всем (кроме значений по умолчанию) в этом сообщении. Это может быть как. Это может быть ни один. Таким образом, в этом сценарии вы просто десериализовали бы его и проверили .sendName
и .sendId
.
Другой распространенный вариант здесь - добавить дискриминатор , возможно, просто перечисление:
enum MesageType {
Error = 0,
Name = 1,
Id = 2
}
и включите , в сообщение:
[ProtoMember(10)]
public MessageType MessageType {get;set;}
Теперь у вас есть явный способ выражения вашего значения типа сообщения.