2012-10-25 20 views
5

Şu anda çok (bazen yuvalanmış) C (veya C++ Düz Eski Veri) yapıları ve dizileri çevresinde geçen kodum var.C yapıları (C++ POD) ve google protobufs arasındaki dönüşüm?

Bunları google protobufs'a dönüştürmek istiyorum. Bu iki format arasında dönüşen kodu elle yazabilirim, ancak bu kodu otomatik olarak oluşturmaya daha az hata olur. Bunu yapmanın en iyi yolu nedir? (Bu üye değişkenlerin isimlerinin üzerinde yineleme için yeterli içgözlem ile bir dilde kolay olurdu, ancak bu bahsettiğimizi C++ kodudur) Ben düşünüyorum

bir şey C yapılar ayrıştırır piton kod yazıyor ve daha sonra bir .proto dosyası ile birlikte, tüm türler için üye (her iki yönde) üyeden kopyalar C kodu ile birlikte tükürür, ama belki daha iyi bir yol var ... veya belki zaten üretebilir başka bir IDL var :

  1. .h dosyasını iç içe türleri içeren
  2. .proto dosyası içeren eşdeğer
  3. .c fi .proto dosyası üretir C++ yapılar ve

cevap

0

Protokol tamponlar TextFormat kullanılarak bir ASCII temsil ayrıştırma inşa edilebilir .h dosyasında tanımlanan yapılar arasında her iki yönde kopyalama fonksiyonları ile le. Yani bir seçenek, her bir yapınızın "dumpAsciiProtoBuf" yöntemini eklemek olacaktır. Yöntem, herhangi bir basit alanı (dizge, boole, vb.) Boşaltır ve iç içe geçmiş yapı alanları üzerinde dumpAsciiProtoBuf'u çağırarak çağırır. Daha sonra, birleştirilmiş sonucun, TextFormat kullanılarak ayrıştırılabilen geçerli bir Ascii protokol arabelleği olduğundan emin olmanız gerekir.

Bunun bazı performans sonuçları olabileceğini unutmayın (ASCII temsilinin ayrıştırılması pahalı olabilir). Bununla birlikte, bu size farklı bir dilde bir çevirici yazma zahmetinden kurtaracak, bu yüzden uygun bir çözüm gibi görünüyor.

+0

Cevabınız için teşekkür ederiz. Bir C++ sınıfının kendi üye değişkenleri üzerinden yineleyebileceğini düşünmüyorum, değil mi? Sabit kodlanmış yapı alanları ile yinelenen çok sayıda kod parçası bulundurmaktan kaçınmaya çalışıyorum. –

0

Bu sorun için hazır bir çözüm bulamadım, varsa, lütfen bana bildirin!

Python'da kendi başınızı döndürmeye karar verirseniz, python bindings for gdb yararlı olabilir. Daha sonra sembol tablosunu okuyabilir, belirtilen dosyada tanımlanan tüm yapıları bulabilir ve tüm yapı üyelerini yineleyebilirsiniz. Daha sonra her üyenin ilkel türünü almak ve uygun protobuf türüne çevirmek için <gdbtype>.strip_typedefs() kullanın.

Bu

ben ve ayrıca Protobuf dönüştürmek için kod tahmin elde edilebilir vb mimari, derleyici bayrakları, önişlemci makroları bağlıdır türlerini idare edecek gibi bir metin ayrıştırıcıları sonra muhtemelen daha güvenlidir ileti alan ilişkilerine yapı elemanı, ancak kolay gelmiyor.

İlgili konular