Десериализация типа в текущем потоковом положении с protobuf-сетью

Я сериализирую несколько объектов в единый поток, но когда я пытаюсь считать их назад, я, может казаться, ничего не получаю кроме последнего объекта:

ProtoBuf.Serializer.Serialize(stream, postA1);
ProtoBuf.Serializer.Serialize(stream, postB1);
stream.Position = 0;
var postA2 = ProtoBuf.Serializer.Deserialize<Post>(stream);
var postB2 = ProtoBuf.Serializer.Deserialize<Post>(stream);

Первые десериализовывают, перемещает поток в конец, и postA2 содержит значение postB1, в то время как postB2 является просто неинициализированным экземпляром. Это - ожидаемое поведение, и если так, как Вы десериализовываете объект от случайного положения в потоке?

7
задан Arne Claassen 14 March 2010 в 08:42
поделиться

1 ответ

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

Чтобы заставить его рассматривать их как разные объекты, посмотрите методы * WithLengthPrefix (или вы можете использовать версии IEnumerable - возможно, DeserializeItems ]; обратите внимание, что префиксы длины будут применены автоматически, если вы дадите ему что-то вроде списка для сериализации); например:

По сути:

Serializer.SerializeWithLengthPrefix(stream, postA1, PrefixStyle.Base128, 1);
Serializer.SerializeWithLengthPrefix(stream, postB1, PrefixStyle.Base128, 1);
stream.Position = 0;
var postA2 = Serializer.DeserializeWithLengthPrefix<Post>(stream,
    PrefixStyle.Base128, 1);
var postB2 = Serializer.DeserializeWithLengthPrefix<Post>(stream,
    PrefixStyle.Base128, 1);
8
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: