8
votes

Conversion entre les structures C (C ++ POD) et Google Protobufs?

J'ai du code qui passe actuellement autour de nombreuses structures et matrices d'anciennes de données C (parfois imbriquées).

Je voudrais convertir celles-ci en / depuis Google Protobufs. Je pourrais manuellement écrire du code qui convertit entre ces deux formats, mais il serait moins sujet aux erreurs pour générer automatiquement ce code. Quelle est la meilleure façon de procéder? (Ce serait facile dans une langue avec une introspection suffisante pour itérer sur les noms des variables des membres, mais c'est C ++ code dont nous parlons)

Une chose que je considère consiste à écrire du code Python qui analyse des structures C puis craignez un fichier .Proto, ainsi que du code C qui copie du membre à un membre (dans les deux sens) pour tous les types, mais peut-être Il y a une meilleure façon ... ou peut-être qu'il y a une autre idl qui peut déjà générer:

  1. .h fichier contenant tous les types imbriqués
  2. .Proto fichier contenant des équivalents
  3. .c fichier avec des fonctions qui copient l'une des directives entre les structures C ++ que le fichier .Proto génère et les structures définies dans le fichier .h

1 commentaires

Je suis un peu confus, passez-vous sur Data ou code ? Si tout ce que vous passez autour est des données, alors qu'est-ce qui ne va pas avec une bibliothèque de sérialisation? Si vos données doivent être lues selon différentes langues, je considérerais quelque chose comme JSON ou similaire. Si vous êtes intéressé par le partage du code, ceci est un problème différent. Ros utilise Python et une bibliothèque pour générer des classes C ++ à partir de messages, et je suis sûr qu'il y a beaucoup d'autres cadres là-bas à l'appui de la génération de code. Pourquoi utilisez-vous Protobuf?


3 Réponses :


0
votes

Les tampons de protocole peuvent être construits en analysant une représentation ASCII en utilisant TextFormat . Donc, une option serait d'ajouter une méthode Dumbasciprotobuf à chacune de vos structures. La méthode viderait des champs simples (tels que des chaînes, des bools, etc.) et des appels Dumbasciprotobuf récursivement sur les champs de structs imbriqués. Vous devriez alors vous assurer que le résultat concaténé est un tampon de protocole ASCII valide qui peut être analysé à l'aide de TextFormat .

Notez que cela pourrait avoir des implications de performance (puisque l'analyse de la représentation ASCII pourrait être coûteuse). Cependant, cela vous éviterait la peine d'écrire un convertisseur dans une langue différente, ce qui semble donc être une solution commode.


1 commentaires

Merci pour la réponse. Je ne pense pas que une classe C ++ puisse parcourir cependant ses propres variables de membre, peut-elle? J'essaie d'éviter de devoir maintenir plusieurs morceaux de code qui iTèrent à travers des champs de structure codée dur.



0
votes

Je n'ai pas pu trouver une solution prête pour ce problème, s'il y en a un, s'il vous plaît laissez-moi savoir!

Si vous décidez de rouler le vôtre en Python, le Liaisons Python pour GDB pourrait être utile. Vous pouvez ensuite lire la table des symboles, trouver toutes les structures définies dans un fichier spécifié et itérer tous les membres de la structure. Ensuite, utilisez .strip_typefs () pour obtenir le type primitif de chaque membre et le traduire en type Protobuf approprié.

Ceci est probablement plus sûr que des analyseurs de texte, car il manipulera des types qui dépendent de l'architecture, des drapeaux de compilateur, des macros de préprocesseur, etc.

Je suppose que le code à convertir et de ProTobuf pourrait également être généré à partir de l'élément de structure à la relation de champ de message, mais ne sonne pas facile.


0 commentaires

0
votes

Je n'utiliserais pas moi-même le code source C moi-même, mais j'utiliserais le libllang Pour analyser les fichiers C dans un Ast et mon propre Walker AST pour générer le Protobuf et les transcodeurs si nécessaire. Googling for "libllang walk ast" devrait donner quelque chose à démarrer avec, comme ast-walker.cc et ast-drumper.cc de Ce référentiel GitHub , par exemple.


0 commentaires