2015-05-15 3 views
2

У меня есть файл Protobuf протокол, который выглядит примерно так:Protobuf-с: Как упаковать вложенные сообщения

message Foo { 
    message Bar { 
     required string name = 1; 
     required string value = 2; 
    } 

    message Baz { 
     required Bar a = 1; 
    } 
} 

Учитывая этот файл протокола, мне нужно написать кодер с использованием Protobuf-с, расширение C для протобуфа. Я написал следующий код:

Foo myfoo = FOO__INIT; 
Foo__Bar mybar = FOO__BAR__INIT; 
Foo__Baz mybaz = FOO__BAZ__INIT; 
mybaz.a = &mybar; 

Однако, я застрял в этот момент о том, как сериализовать mybaz. Сгенерированная структура для Foo не содержит записи, которую я могу назначить mybaz. И никакого метода для создания непосредственно пакета Baz.

В Python это было намного проще, поскольку была создана функция mybaz.SerializeToString(). Как мне это сделать в C?

ответ

1

Объявление вложенных типов в буферах протоколов похоже на объявление вложенных классов в C++ или static внутренних классах на Java. Это просто объявляет новый тип; он не добавляет поля к внешнему типу. Итак, в вашей прото-схеме Foo - это совершенно пустое сообщение - у него нет полей. Это справедливо независимо от языка программирования вы работаете в

Возможно, что вы имели в виду сделать что-то вроде этого:.

message Foo { 
    message Bar { 
    required string name = 1; 
    required string value = 2; 
    } 

    message Baz { 
    required Bar a = 1; 
    } 

    optional Baz baz = 1; 
} 

Теперь Foo имеет поле под названием baz, в которую вы можете назначить Baz объект.

+0

Это имеет смысл. Однако, к сожалению, я не контролирую прото-файл. Протокол был разработан третьей стороной, и я должен использовать клиентское приложение, использующее его. Используя стандартную библиотеку C++ Protobuf, она работает так, как ожидалось. – darnir

+0

@ darnir При повторном чтении я думаю, что неправильно понял ваш первоначальный вопрос. Меня отбросила «Сгенерированная структура для Foo, не содержит записи, которую я могу присвоить« mybaz ». - это ожидается, учитывая объявление типа. Но похоже, что вы действительно ищете, это способ сериализации структуры 'Baz' напрямую. Это должно быть обеспечено сгенерированным кодом, но возможно, что protobuf-c имеет ошибку и не генерирует такую ​​функцию. Я бы подал на них ошибку. –