2012-03-10 3 views
2

Мне нужно сериализовать большой массив объекта размером 100000 в файл, но во время де-сериализации я хотел бы прочитать патрон из 1000 объектов на чтение.Стрит/Прото Как?

В настоящее время я не нахожу хороших примеров либо Thrift, либо Protocol Buffer для C#. Пожалуйста, кто-нибудь может мне помочь.

С уважением

ответ

2

Ну Protobuf-CSharp-порт имеет MessageStreamIterator и MessageStreamWriter которые позволяют выписывать последовательность, а затем перебирать их, как вы десериализации. Затем вы можете использовать LINQ to Objects, чтобы получить 1000 или что угодно.

1

Если вы используете 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, так, чтобы добавить больше данных в файл, который вы просто искать до конца файла и начать писать больше данных.

+0

Являются ли наши два решения совместимыми друг с другом, из интереса? –

+0

Спасибо за ваш быстрый ответ, это будет здорово, если вы сможете представить полный пример. – tabreaz

+0

@ Jon мой, за элемент: ** необязательный ** тег как varint, обычно «1», затем длина как varint, а затем полезная нагрузка. Это совместимо? –

Смежные вопросы