J'ai du code qui passe actuellement autour de nombreuses structures et matrices d'anciennes de données C (parfois imbriquées). p>
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) p>
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: p>
3 Réponses :
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 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. P> Dumbasciprotobuf code> à chacune de vos structures. La méthode viderait des champs simples (tels que des chaînes, des bools, etc.) et des appels
Dumbasciprotobuf code> 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 . P>
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.
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! p>
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 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. P>
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. P>
Je n'utiliserais pas moi-même le code source C moi-même, mais j'utiliserais le libllang A > 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 code> et
ast-drumper.cc code> de
Je suis un peu confus, passez-vous sur Data i> ou code i>? 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 code> 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?