Если требуется работа с несколькими сообщениями разных типов:
Просто свяжите уникальный номер с каждым другим типом сообщения и используйте в качестве префикса к сообщению; Вы можете сделать это тривиально с необязательным целочисленным параметром для перегруженного метода SerializeWithLengthPrefix
. Клиенту придется предварительно обработать этот префикс (или он может быть обработан в protobuf-net с помощью Serializer.NonGeneric
, который имеет метод десериализации, обеспечивающий обратный вызов для получения типа из этого номера префикса).
Если требуется работать с полностью неизвестными данными :
Учитывая ваши требования, я подозреваю порт Джона будет более подходящим; поскольку вы делаете упор на независимость от платформы и .proto, а не на умозаключение (в котором превосходит protobuf-net) или другие специальные расширения / утилиты .NET.
Обратите внимание, что хотя .proto можно скомпилировать (через protoc) в обычный поток protobuf, работа с полностью посторонними данными в приемнике ... нерегулярна. Вероятно, это можно сделать, рассматривая все как расширения или работая с кодированными потоками, но ...
Редактировать следующее обсуждение в комментариях:
Простая схема здесь может быть просто:
message BaseMessage {
optional SomeMessage someMessage = 1;
optional SomeOtherMessage someOtherMessage = 2;
optional SomeThirdMessage someThirdMessage = 3;
}
message SomeMessage {...}
message SomeOtherMessage {...}
message SomeThirdMessage {...}
(вы можете добавить дискриминатор, если это поможет)
Это на самом деле по существу , как protobuf-net обрабатывает наследование , но легко представляется другими клиентами и автоматически обрабатывает все, например, длину вложенных сообщений.