Я сериализирую несколько объектов в единый поток, но когда я пытаюсь считать их назад, я, может казаться, ничего не получаю кроме последнего объекта:
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 является просто неинициализированным экземпляром. Это - ожидаемое поведение, и если так, как Вы десериализовываете объект от случайного положения в потоке?
По по умолчанию 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);