Есть несколько способов сделать это. Я не на самом деле уверен, что расширения, это то, что я бы прыгнул, но:
в вашем типе сообщения вы можете иметь набор полностью определенных полей для каждого под-сообщения, т.е.
base-message
{1-5} common fields
{optional 20} sub-message 1
{optional 21} sub-message 2
{optional 22} sub-message 3
{optional 23} sub-message 4
sub-message 1
{1-n} specific fields
где у вас будет ровно один объект под-сообщения
альтернативно, инкапсулирует общие части внутри более конкретного сообщения:
common field type
{1-n} fields
sub-message 1
{1} common field type
{2-m} specific fields
Любой подход позволит вам десериализовать; вторая сложнее, IMO, так как она требует, чтобы вы знали тип заранее. Единственный удобный способ сделать это - префикс каждого идентификатора. Лично я предпочитаю первое. Это, однако, не требует расширений - так как мы знаем все заранее. Как это происходит, во-первых, также как protobuf-net реализует наследование, так что вы можете сделать это с наследованием типов (4 конкретных подтипа абстрактного базового типа сообщения) и [ProtoInclude(...)]
Повторное расширение данных; Protobuf-net поддерживает , однако , как упоминается в блоге , не включено в текущую бета-версию v2. Это будет там в ближайшее время, но мне пришлось где-то поставить строку. Он включен в версию v1 (r282), хотя
Обратите внимание, что protobuf-net является лишь одной из нескольких реализаций C # / .NET. Формат проводника такой же, но вы также можете рассмотреть напрямую портированную версию . Если бы мне пришлось суммировать разницу, я бы сказал, что «protobuf-net - это сериализатор .NET, который оказывается protobuf; protobuf-csharp-port - это сериализатор protobuf, который оказывается .NET» - оба они достигают одного и того же конца, но Protobuf-net фокусируется на том, чтобы быть идиоматичным для C # /. NET, где порт больше ориентирован на использование того же API. Либо здесь должно работать, конечно.