Как динамически построить новый protobuf из набора уже определенных дескрипторов?

На моем сервере мы получаем самоописываемые сообщения (, как определено здесь ... что, кстати, было не так просто, поскольку в c++ нет «хороших» примеров этого ).

На данный момент у меня нет проблем с созданием сообщений из этих самоописанных -. Я могу взять FileDescriptorSet, просмотреть каждый FileDescriptorProto , добавив каждый в DescriptorPool (, используя BuildFile , что также дает мне каждый определенный FileDescriptor ).

Отсюда я могу создать любое из сообщений, которые были определены в FileDescriptorSet с помощью DynamicMessageFactory с экземпляром DP и вызовом GetPrototype(что очень легко сделать, так как для нашего SelfDescribedMessage требуется полное _имя сообщения (), и, таким образом, мы можем вызвать метод FindMessageTypeByName DP, что дает нам правильно закодированный прототип сообщения ).

Вопрос в том, как я могу взять каждый уже определенный дескриптор или сообщение и динамически СОЗДАТЬ «главное» сообщение, которое содержит все определенные сообщения как вложенные сообщения. В первую очередь это будет использоваться для сохранения текущего состояния сообщений. В настоящее время мы справляемся с этим, просто копируя тип каждого сообщения на сервере (, чтобы сохранить центральное состояние в разных программах ). Но когда мы хотим «сохранить» текущее состояние, мы вынуждены передавать их на диск, как определено здесь . Они передаются по одному сообщению за раз (с префиксом размера ). Мы хотели бы иметь ОДНО сообщение (, чтобы управлять всеми )вместо непрерывного потока отдельных сообщений.Это можно использовать для других целей после того, как оно будет разработано (общее состояние на основе сети с оптимизированной и простой сериализацией)

Поскольку у нас уже есть перекрестно -связанные и определенные дескрипторы, можно было бы подумать, что существует простой способ создания «новых» сообщений из уже определенных. До сих пор решение намекало нам. Мы пытались создать свой собственный DescriptorProto и добавить новые поля типа из наших уже определенных дескрипторов, но заблудились (и еще не углубились в этот ). Мы также рассмотрели возможность добавления их в качестве расширений (, пока неизвестно, как это сделать ). Нужно ли нам создавать собственную DescriptorDatabase(также неизвестно в настоящее время, как это сделать )?

Любые идеи?


Связанный пример источника на BitBucket.


Надеюсь, это объяснение поможет.

Я пытаюсь динамически построить сообщение из набора уже определенных сообщений. Набор уже определенных сообщений создается с помощью метода "самоописание -", описанного (кратко )в официальном учебнике по c++ protobuf (, т. е. эти сообщения недоступны в скомпилированной форме ). Это новое определенное сообщение необходимо будет создать во время выполнения.

Пробовали использовать прямые дескрипторы для каждого сообщения и пытались создать FileDescriptorProto. Пробовали просматривать методы DatabaseDescriptor. Оба без везения. В настоящее время предпринимается попытка добавить эти определенные сообщения в качестве расширения к другому сообщению (, даже если во время компиляции эти определенные сообщения и их «набор дескрипторов -» не были классифицированы как расширяющие что-либо ), с чего начинается пример кода..

28
задан Michael Kohne 30 July 2014 в 11:58
поделиться