protobuf- net потоковые объекты с диска - PullRequest
1 голос
/ 27 января 2020

Учтите, у меня есть очень большая коллекция (миллионы) объектов, сериализованных в соответствии с форматом прото-проводов Возможно ли передать эти элементы из файла? Я попытался сериализовать объекты как List<T>, а затем десериализовать один элемент T, но в итоге он прочитал только последний элемент из потока. Я также пытался сериализовать каждый экземпляр индивидуально в поток с тем же эффектом, что и при десериализации, при этом он считывал только последний элемент.

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

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

0: мета-информация для первого объекта, включая тип / длину в байтах 1: объект определено в 0 2: метаинформация для второго объекта, включая тип / длину в байтах 3: объект определен в 2 4: ... et c

Информация о версии: в настоящее время я использую do tnet ядро ​​3.1 и protobuf- net версия 2.4.4

1 Ответ

1 голос
/ 27 января 2020

В protobuf объект root по умолчанию не завершен, с намерением разрешить "слияние" === "добавление". Это противоречит очень распространенному сценарию, который вы описываете. К счастью, по этой причине многие библиотеки предоставляют механизм для кодирования длины перед объектом. То, что вы ищете, это методы SerializeWithLengthPrefix и DeserializeWithLengthPrefix.

Если данные уже существуют как плоские добавления и не могут быть перезаписаны: все еще есть способы восстановить их, используя API-интерфейс для чтения. Немного сложнее, но в прошлом я восстанавливал такие данные для людей при необходимости.

...