2012-10-25 12 views
5

Mam kod, który obecnie przechodzi wokół wielu (czasami zagnieżdżonych) struktur i tablic C (lub C++ Plain Old Data).Konwersja między strukturami C (C++ POD) i google protobufs?

Chciałbym konwertować te do/z google protobufs. Mógłbym ręcznie napisać kod, który konwertuje pomiędzy tymi dwoma formatami, ale generowanie takiego kodu byłoby mniej podatne na błędy. Jaki jest najlepszy sposób na zrobienie tego? (To byłoby łatwe w języku z wystarczającą introspekcją do iterowania nazw zmiennych członkowskich, ale to jest kod C++, o którym mówimy)

Jedną z rzeczy, którą rozważam jest pisanie kodu Pythona, który analizuje C-style a następnie wypluwa plik .proto, wraz z kodem C, który kopiuje od członka do elementu (w dowolnym kierunku) dla wszystkich typów, ale może jest lepszy sposób ... lub może istnieje inny IDL, który już może generować :

  1. .h plik zawierający wszystkie zagnieżdżonych typów
  2. plik .proto zawierające równoważniki
  3. .c fi le z funkcji, które kopiują obu kierunkach między struktur C++, który generuje plik .proto i strukturach zdefiniowanych w pliku .h

Odpowiedz

0

bufory protokół może być zbudowany przez analizowania ASCII pomocą TextFormat. Tak więc jedną z opcji byłoby dodanie metody "dumpAsciiProtoBuf" do każdej ze swoich struktur. Metoda zrzuci wszystkie proste pola (takie jak łańcuchy, znaki itd.) I wywoła rekursywnie dumpAsciiProtoBuf w zagnieżdżonych polach structs. Następnie należy upewnić się, że połączony wynik jest prawidłowym buforem protokołu Ascii, który można przeanalizować, używając TextFormat.

Należy jednak zauważyć, że może to mieć wpływ na wydajność (ponieważ przetwarzanie reprezentacji ASCII może być kosztowne). Jednak to zaoszczędziłoby ci kłopotu z pisaniem konwertera w innym języku, więc wydaje się, że jest to wygodne rozwiązanie.

+0

Dzięki za odpowiedź. Nie sądzę, że klasa C++ może iterować poprzez własne zmienne składowe, czyż nie? Próbuję uniknąć konieczności utrzymywania wielu fragmentów kodu, które przechodzą przez zakodowane pola struktury. –

0

Nie mogłem znaleźć gotowego rozwiązania tego problemu, jeśli taki istnieje, proszę dać mi znać!

Jeśli zdecydujesz się rzucić własną w python, może być przydatne python bindings for gdb. Następnie można odczytać tabelę symboli, znaleźć wszystkie struktury zdefiniowane w określonym pliku i iterować wszystkich członków struktury. Następnie użyj <gdbtype>.strip_typedefs(), aby uzyskać prymitywny typ każdego elementu i przetłumacz go na odpowiedni typ protobuf.

Prawdopodobnie jest bezpieczniejsze następnie parserami tekstowych jak będzie obsługiwać typy to zależy od architektury, flag kompilatora, makr preprocesora itd

Chyba kod do konwersji do iz Protobuf również może być generowany z członek struktury do relacji pola komunikatu, ale nie brzmi łatwo.