Ограничения протобуферов - загрузка частичных данных и разделение строк

Я хочу проверить, является ли proto-буфер лучшим сериализатором для моего использования, мои исследования не обнаружили ничего другого. Я работаю над мобильным приложением java backend и android (java), однако возможно, что другой клиент будет создан в недалеком будущем, поэтому я хочу что-то перекрестная платформа. Грубая схема структуры данных:

message All {
    repeated Line lines = 1;
    Common common = 2;
}

Существует несколько сотен объектов Line, каждая строка является довольно сложной и составляет ~ 100 кБ по отдельности.

Две проблемы, которые я вижу с протобуфером - при запуске приложения мне нужна только часть доступных данных - просто "Обычная" и основная информация из "Линии". Можно ли загружать частичные данные? - каждый объект Line содержит сотни строк, но одна и та же строка встречается в нескольких объектах Line, поэтому я хочу попытаться поделиться ими между этими объектами. Возможно ли это на уровне proto buf или требуется часть уровня приложения?

Спасибо!

Ответ 1

Из ограниченной спецификации, которую вы дали, довольно сложно дать правильную обратную связь. Вы заявили, что для вашей проблемы лучшим решением является протобуф, но мы не можем переоценить это из приведенной информации.

Основываясь на том, что вы написали, я бы даже сказал, что простой массив байтов GZIPped (или JSON, поскольку большинство из них является пригодным для печати (вы сказали, что они String s)), может быть лучше для вас ( "многократно использовать" много материал через объекты Line = > GZIP будет качаться).

И как утверждали другие: с protobuf невозможно загрузить "частичные структуры данных" (на самом деле ваша не будет частичной, если "повторяющаяся" часть, например, Collection, потому что protobuf будет позаботьтесь о сегментировании ваших данных в самой структуре).

Я бы поставил свои два цента на потоки GZIPped JSON (например, с Джексоном), конечно, в этом случае вы бы снизили пропускную способность со стоимостью циклов процессора.

Ответ 2

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

message All {
    repeated Line lines = 1;
    Common common = 2;
}

message All_partial {
    Common common = 2;
}

Поскольку все поля в proto3 являются необязательными, мы можем иметь второе определение нашей структуры с "частичными" полями. Если мы сохраним тот же номер поля, я надеюсь, что все будет в порядке.