Protobuf (C ++) выдает ошибку «отсутствует обязательный параметр» для необязательного поля - PullRequest
0 голосов
/ 20 января 2020

Я связываюсь между встроенным устройством, которое использует nanopb, и настольным компьютером P C, который использует protobuf- c, но при синтаксическом анализе закодированного сообщения появляется ошибка. Встроенное устройство отправляет сообщение «Ответ» с необязательным полем другого типа сообщения (ResponseContent). Другое сообщение имеет обязательные поля. Вот определение сообщения

syntax = "proto2";

package Message;

message Response
{
    enum RESPONSE_TYPES
    {
        OK = 0;
        ERROR = 1;
        BUSY = 2;
        STATUS = 3;
    }

    required RESPONSE_TYPES type = 1;
    optional ResponseContent response_content = 2;
}

message ResponseContent
{
    enum CONTENT_TYPES
    {
        DIN = 0;
        DOUT = 1;
        AIN = 2;
        AOUT = 3;
    }

    required CONTENT_TYPES type = 1;

    oneof result
    {
        Din din = 21;
        Dout dout = 22;
        Ain ain = 23;
        Aout aout = 24;
    }

}

message Din
{
    required bool state = 1;
}
message Dout
{
    required bool ack = 1;
}
message Ain
{
    required float val = 1;
}
message Aout
{
    required bytes payload = 1;
}

Почему появляется ошибка «пропущены обязательные поля», когда тип ResponseContent в сообщении ответа является необязательным, а для параметра has_response_content установлено значение false ? примечание: очевидно, что это происходит с * bool ParseFromArray (const void * data, int size) *, а не с * bool ParsePartialFromArray (const void * data, int size) *

...