Как сделать протобуф с перекрестными ссылками на сообщения? - PullRequest
1 голос
/ 21 января 2020

Я использую приведенное ниже сообщение protobuf для представления древовидной структуры

message Foo {
  uint32 value = 1;
  repeated Foo children = 3;
}

Теперь я хочу добавить двух детей в узел, в основном я делаю

Foo foo;
Foo *c1 = foo->add_children();
Foo *c2 = foo->add_children();
c1->set_value(1);
c2->set_value(1);

Поскольку дочерний элемент 1 и Дочерние элементы 2 идентичны, дублирование данных занимает много места (на практике у меня есть огромные спутниковые данные для каждого узла), есть ли в любом случае, что я могу позволить дочернему элементу 2 быть указателем (или ссылкой) на дочерний элемент 1, чтобы сэкономить место , Например, как псевдокод ниже:

Foo foo;
Foo *c1 = foo->add_children();
foo->add_children_with_pointer(c1); // doesn't work

1 Ответ

0 голосов
/ 21 января 2020

Есть два разных способа интерпретации вопроса здесь; на фактическом транспортном уровне отсутствует понятие перекрестных ссылок; полезные данные будут продублированы на выходе.

В терминах представления в памяти; в основном это будет реализация / библиотека-спецификация c. В версиях C#, например: вы просто ... добавили бы ту же ссылку на объект снова, и она должна работать. Версия C ++, тем не менее, имеет гораздо более сильную модель владения из-за реализации арен. Вы можете попробовать AddAllocated, но у меня есть догадка, что это тоже не сработает. В разделе «Расширенное управление памятью» есть несколько пунктов, но я не уверен, что ваш сценарий поддерживается.


Как примечание, даже в библиотеках, где у нас была модель с один и тот же объект использовался дважды: мы должны помнить, что при десериализации этих данных * 1013 мы все равно получим два разных экземпляра, а не один экземпляр с одинаковой ссылкой в ​​двух местах - так как нет «идентификатора объекта» (или подобного) как части protobuf. С точки зрения десериализатора, это просто два совершенно разных объекта, которые имеют одинаковое содержимое. Значение: даже если вы работаете при сериализации; Ваши усилия не будут уважаться при десериализации. Итак: во многих отношениях это бесполезная попытка - в конце концов, вы, вероятно, захотите десериализовать данных, и в этот момент: вы вернулись туда, куда не хотели будет.

...