Как перенести данные из protobuf-embedded-c в библиотеку Google protobuf C++/Java?

Я использую protobuf-embedded-cна небольшой системе для передачи различных данных с него на ПК. Проблема в том, что если я использую встроенную библиотеку на обоих концах, все работает. Если я использую Google C++ на ПК, он больше не работает. Я думаю, что я проследил проблему до встроенной библиотеки, имеющей префиксы длины в каждом сообщении, но я не могу сделать это хорошо в библиотеке C++. Вот тестовое приложение, которое я использовал для отладки:

person.proto:

enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
}

message PhoneNumber {
  required float number = 1;
  required PhoneType type = 2;
}

main.cpp:

#include 
#include 

#define __PROTOBUF_CPP_IMPL

#ifdef __PROTOBUF_CPP_IMPL
#include "person.pb.h"
#else
    extern "C"{
        #include "person.h"
    }
#endif

int main(int argc, char *argv[])
{
    static const uint32_t outputbuflen = 1024;
    uint8_t outputbuffer[outputbuflen];
    uint32_t writtenlenght = 0;

#ifdef __PROTOBUF_CPP_IMPL

    // C++ implementation.
    printf("Google C++ implementation;\n");
    PhoneNumber number;
    number.set_number(0800123123.0);
    number.set_type(MOBILE);

    writtenlenght = number.ByteSize();
    numberSerializeToArray(outputbuffer, writtenlenght);

#else

    // Embedded c implementation.
    printf("embedded-c implementation:\n");
    PhoneNumber number;
    number._number = 0800123123.0;
    number._type = _MOBILE;

    writtenlenght = PhoneNumber_write_delimited_to(&number, outputbuffer, 0);

#endif

    for(uint32_t i = 0; i < writtenlenght; i++){
        printf("%.2X ", outputbuffer[i]);
    }
    printf("\n");
    return 0;
}

Настоящий вопрос: Какие методы следует использовать в библиотеке Google protobuf C++/Java для успешного взаимодействия со встроенной библиотекой? Простой ответ, вероятно, состоял бы в том, чтобы добавить (читать при анализе) префикс ко всем сообщениям, но это нарушает код. Должен ли я просто искать лучшую встроенную библиотеку?

Обновление: я попробовал эту замечательную маленькую библиотеку под названием nanopb, и пока она прекрасно работает. Итог: protobuf-embedded-c НЕ совместим с реализацией google protobuf!

Protobuf comparision.

8
задан rotator 3 June 2012 в 16:25
поделиться