Если вы используете protobuf-net, существует метод DeserializeItems (или аналогичный), который обеспечивает реализацию, не буферизированную, позволяя вам потреблять предметы по своему усмотрению (подходит для LINQ «Take» и т. Д.). Это отлично работает, если исходный сериализованный объект представляет собой список/массив объектов. Он также полностью совместим с методом DeserializeWithLengthPrefix, который считывает один объект из потока без чрезмерного чтения (как журнал, как длина с префиксом, который имеет дело, если массив/список элементов сериализуется), что позволяет вы должны сделать то же самое, например, в цикле «while». Дайте мне знать, если вы хотите получить более полные примеры.
Пример:
// write
YourType[] array = ...;
Serializer.Serialize(destination, array);
// read
List<YourType> batch = new List<YourType>(1000);
foreach(var item in Serializer.DeserializeItems<YourType>(source)) {
batch.Add(item);
if(batch.Count == 1000) {
ProcessBatch(batch);
batch.Clear();
}
}
if(batch.Count != 0) ProcessBatch(batch);
Следует также отметить, что буферы протокола является appendable, так, чтобы добавить больше данных в файл, который вы просто искать до конца файла и начать писать больше данных.
Являются ли наши два решения совместимыми друг с другом, из интереса? –
Спасибо за ваш быстрый ответ, это будет здорово, если вы сможете представить полный пример. – tabreaz
@ Jon мой, за элемент: ** необязательный ** тег как varint, обычно «1», затем длина как varint, а затем полезная нагрузка. Это совместимо? –