Если это часть сообщения, то в данный момент: нет.Поскольку это поле 1, я мог бы потенциально предварительно просмотреть их, но даже это взлом (нет гарантии, что поле 1 будет первым - спецификация ясно дает понять, что вы должны разрешить любой порядок).
Однако!
может быть вариант, если вы открыты для небольшого рефакторинга.Если это линейная гетерогенная последовательность сообщений, то другой способ ее кодирования - использовать реализацию SerializeWithLengthPrefix
, передавая разные теги для каждого типа сообщений - тогда у вас есть последовательность, подобная (будучи немного либеральной с представлением)
1:[tick-body] 2:[some-other-body] 1:[tick body] etc
конечно, это немного зависит от сопоставления другого конца, но если я не ошибаюсь, это довольно хорошо связывается с SAX-подобной обработкой , обсуждаемой здесь (как предложение),что, кстати, также полностью совместимо с тем, как работает десериализация NonGeneric.Вот пример того, что only десериализует объекты Bar
, показывая «2» и «4» на консоли:
using System;
using System.IO;
using ProtoBuf;
[ProtoContract]
class Foo
{
[ProtoMember(1)]
public int A { get; set; }
}
[ProtoContract]
class Bar
{
[ProtoMember(1)]
public int B { get; set; }
}
static class Program
{
static void Main()
{
using (var ms = new MemoryStream())
{
Serializer.SerializeWithLengthPrefix(ms, new Foo { A = 1 }, PrefixStyle.Base128, 1);
Serializer.SerializeWithLengthPrefix(ms, new Bar { B = 2 }, PrefixStyle.Base128, 2);
Serializer.SerializeWithLengthPrefix(ms, new Foo { A = 3 }, PrefixStyle.Base128, 1);
Serializer.SerializeWithLengthPrefix(ms, new Bar { B = 4 }, PrefixStyle.Base128, 2);
ms.Position = 0;
// we want all the Bar - so we'll use a callback that says "Bar" for 2, else null (skip)
object obj;
while (Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms, PrefixStyle.Base128,
tag => tag == 2 ? typeof(Bar) : null, out obj))
{
Console.WriteLine(((Bar)obj).B);
}
}
}
}
На проводе это фактически совместимо сродительский объект:
repeated foo foo = 1;
repeated bar bar = 2;
Если предложенный option generate_visitors
будет реализован, вы сможете использовать гетерогенный поток данных того же типа из любого клиента.Очевидное сопоставление было бы чем-то вроде необязательного свойства в [ProtoContract]
, чтобы помочь с этим - но я не хочу добавлять это, пока новая функция protobuf не станет ясной, поскольку пока она выглядит как точное соответствие моей реализации.Что приятно.