API, чтобы узнать тип протобуфа Сообщение отправляется в - PullRequest
3 голосов
/ 12 июля 2010

Что такое API, чтобы знать, какой тип протобуфа отправляется Сообщение?

Например, я использую следующее для получения объекта SendNameMessage.

SendNameMessage sendNameObj = Serializer.DeserializeWithLengthPrefix (поток, PrefixStyle.Fixed32);

Как слушатель узнает, какое сообщение отправляется?

Ниже приведен мой класс SendNameMessage:

[ProtoContract]
class SendNameMessage
{
    [ProtoMember(1)]
    public string sendName { get; set; }

    [ProtoMember(2)]
    public int sendId { get; set; }
}

Как узнать, является ли отправляемое сообщение sendName или sendId?

1 Ответ

3 голосов
/ 13 июля 2010

protobuf (при любой реализации) - это просто API-интерфейс сериализации. При разговоре по проводам по умолчанию состоит в том, что оба конца уже согласны с данными. Для отправки различных типов сообщений предлагается несколько вариантов:

  1. имеет объект-оболочку, который просто имеет дочерние объекты для представления различных типов сообщений. С protobuf-net , в частности , вы также можете напрямую сопоставить это с наследованием (поскольку протокол Probuf-Net сопоставляет наследование с инкапсуляцией)
  2. используйте заголовок сообщения - какие-то данные перед вашим сообщением, которые идентифицируют это. В частности, если используется стиль префикса 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;}

Теперь у вас есть явный способ выражения вашего значения типа сообщения.

...