Преобразование между структурами C (C ++ POD) и google protobufs?

У меня есть код, который в настоящее время проходит через множество (иногда вложенных) структур и массивов C (или C ++ Plain Old Data).

Я хотел бы преобразовать их в / из Google Protobufs. Я мог бы вручную написать код, который конвертируется между этими двумя форматами, но он был бы менее подвержен ошибкам при автоматической генерации такого кода. Каков наилучший способ сделать это? (Это было бы легко в языке с достаточным самоанализом для перебора имен переменных-членов, но мы говорим об этом на C ++)

Одна вещь, которую я рассматриваю, — это написание кода Python, который анализирует структуры C, а затем выплевывает файл .proto вместе с кодом C, который копирует данные от члена к члену (в любом направлении) для всех типов, но, возможно, есть лучше … или, может быть, есть еще один IDL, который уже может генерировать:

  1. .h файл, содержащий все вложенные типы
  2. .файл прото, содержащий эквиваленты
  3. .c файл с функциями, которые копируют любое направление между структурами C ++, которые генерирует файл .proto, и структурами, определенными в файле .h

6

Решение

Я не мог найти готовое решение этой проблемы, если есть, пожалуйста, дайте мне знать!

Если вы решили свернуть свой собственный в Python, привязки Python для GDB может быть полезным. Затем вы можете прочитать таблицу символов, найти все структуры, определенные в указанном файле, и выполнить итерацию всех элементов структуры.
Тогда используйте <gdbtype>.strip_typedefs() чтобы получить примитивный тип каждого члена и перевести его на соответствующий тип protobuf.

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

Я предполагаю, что код для преобразования в protobuf и из него также может быть сгенерирован из отношения struct member к message field, но это звучит нелегко.

0

Другие решения

Буферы протокола могут быть построены путем анализа представления ASCII с использованием TextFormat. Таким образом, один из вариантов будет добавить метод dumpAsciiProtoBuf к каждой из ваших структур. Метод будет выводить любые простые поля (например, строки, bools и т. Д.) И вызывать dumpAsciiProtoBuf рекурсивно на вложенных структурах полей. Затем вам нужно убедиться, что объединенный результат является действительным буфером протокола ASCII, который можно проанализировать с помощью TextFormat.

Обратите внимание, что это может иметь некоторые последствия для производительности (поскольку анализ представления ASCII может быть дорогим). Однако это избавит вас от необходимости писать конвертер на другом языке, так что это кажется удобным решением.

0

Я бы не стал анализировать исходный код на C, а использовал бы LibClang проанализировать файлы C в АСТ и мой собственный ходок AST для генерации Protobuf и транскодеры по мере необходимости. Поиск в Google по «libclang walk AST» должен дать что-то для начала, например: ast-walker.cc а также ast-dumper.cc от этот репозиторий GitHub, например.

0
По вопросам рекламы [email protected]