Как использовать плоские буферы, когда схема не зафиксирована? - PullRequest
0 голосов
/ 25 января 2019

Текущая работа моего приложения на C ++ выглядит следующим образом:

1. Он включает запуск другого процесса и использует общую память Windows для связи между двумя процессами.
2. Данные сериализуются в одном процессе и десериализуются в другом процессе. Однако тип данных также может варьироваться в зависимости от пользовательских данных, и, следовательно, тип также сериализуется, чтобы десериализатор мог правильно интерпретировать данные.

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

  1. В зависимости от типа данных я могу программно сгенерировать схему и передать ее в flatc.exe для генерации файлов. Однако вместо использования flatc.exe я собираюсь создать flatc.dll (из открытого исходного кода) и использовать ее для упрощения взаимодействия. Это звучит мудрее?

  2. Во-вторых, я не уверен в следующем. Я создам схему и вызову 'Flat Buffer compiler' во время работы приложения. Это сгенерирует некоторые файлы C ++. Теперь, насколько я понимаю, мне нужно как-то создавать эти файлы, и встроенный двоичный файл должен быть подключен как к сериализатору, так и к десериализатору для сериализации и десериализации фактических данных - и это все во время работы приложения. Как мне достичь всего этого?
    Эта проблема связана с тем, что мое приложение не имеет фиксированной схемы. Каков общий подход к использованию плоских буферов, когда схема является переменной?

Надеюсь, мне ясно, о чем я собираюсь спросить. Если нет, пожалуйста, дайте мне знать. Я буду рад предоставить более подробную информацию. Спасибо за ваши ответы заранее.

1 Ответ

0 голосов
/ 25 января 2019

Ответ в том, что вы этого не хотите.Хотя это выполнимо, особенно генерация C ++ во время выполнения, компиляция его в DLL и последующая загрузка обратно в ваш процесс - это крайне неуклюжий способ сделать это.

Структуры данных вашей программы должны быть известны при компиляциивремя (если оно написано на C ++), так почему вы не можете определить схему для этого только один раз и скомпилировать ее заранее?Позволяет ли ваша программа «проектировать» структуры данных во время выполнения?

Для чрезвычайно динамичных случаев использования, например, когда пользователь может создавать произвольные объекты, я бы порекомендовал FlexBuffers (https://google.github.io/flatbuffers/flexbuffers.html). Они могутиспользоваться внутри FlatBuffer для хранения «неизвестных» данных или даже в качестве их собственного формата сериализации. С их помощью вы можете сериализовать объекты, структура которых известна только во время выполнения, они имеют большинство одинаковых свойств эффективности FlatBuffers, и вы выиграли 'не нужно связывать компилятор C ++ с вашей программой:)

Best - это комбинация двух, где все известные во время компиляции данные хранятся в FlatBuffers, а остальные - в FlexBuffers.

...