Чтение / запись структуры конфигурации в Cap'nProto - PullRequest
0 голосов
/ 31 мая 2019

У меня есть встроенное приложение на C ++, и я хотел бы создать веб-интерфейс для его настройки.

Я планирую описать структуры конфигурации в Cap'nProto, а затем использовать сгенерированный код на стороне C ++ и Javascript.

Сценарий конфигурации будет следующим:

  1. веб-приложение запрашивает актуальную конфигурацию (Javascript)

  2. собственное приложение обслуживает актуальную конфигурацию - сериализация / запись (C ++)

  3. веб-приложение отображает актуальную конфигурацию после десериализации / чтения (Javascript)
  4. пользователь может изменить конфигурацию в веб-приложении - КАК? (Javascript)
  5. веб-приложение отправляет обратно новый конфиг - сериализация / запись (Javascript)
  6. родное приложение использует новую конфигурацию после десериализации / чтения (C ++)
  7. родное приложение может изменять конфиг - КАК? (C ++)

4 и 7 - сложные части, потому что, насколько я понимаю API, я могу только десериализовать считыватель, который только для чтения, однако я хотел бы изменить и повторно сериализовать его позже.

Мои вопросы следующие:

  • Является ли описанный сценарий лучшим подходом к тому, что я хочу, или я должен сделать что-то совершенно другое?
  • Могу ли я десериализовать конструктор? Или как-то превратить ридер в конструктор (без копирования)
  • Должен ли я использовать сгенерированные структуры C ++ / Javascript в качестве прямого источника конфигурации (фактический код <-> структуры Cap'nProto) или я должен ввести "нативные" структуры для взаимодействия с (реальный код <-> "нативные" структуры) <-> (сериализация / десериализация) структуры Cap'nProto)

1 Ответ

1 голос
/ 01 июня 2019

Чтобы ответить на второй вопрос, вы можете инициализировать Builder из Reader, например:

fooBulider.setBar(someBarReader);

Или для MessageReader / MessageBuilder верхнего уровня:

messageBuilder.setRoot<RootType>(messageReader.getRoot<RootType>());

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

Теоретически также возможно создать MessageBuilder, который непосредственно инициализируется из существующих данных сообщения, которые он затем модифицирует на месте. Тем не менее, есть некоторые серьезные оговорки с этим. См:

https://github.com/capnproto/capnproto/blob/3aa2b2aa02edb1c160b154ad74c08c929a02512a/c++/src/capnp/message.h#L168-L187

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

...