LINUX.ORG.RU

Как добавить пустое сообщение в protobuf?

 ,


0

1

Привет! Пусть у меня есть сообщения:

message MessageHeader
{
    required uint32 id = 1;
};

message MessageBody
{
    oneof body
    {
        Error           _error           = 1;
        SystemStarted   _SystemStarted   = 2;
        SystemStoped    _SystemStoped    = 3;    
};
message SystemStarted
{
}

message SystemStoped
{
}



message Message
{
    required MessageHeader header  = 1;
    required MessageBody   body    = 2;
}


Я хочу сформировать сообщение Message:

msg = Message()
msg.header.id = 2
msg.body._SystemStarted #Вот тут не понятно!
По идее же должно быть
msg.body._SystemStarted = Message.SystemStarted()
Но так не срабатывает, вываливается
AttributeError: Assignment not allowed to composite field "_SystemStateRequest" in protocol message object.
Как мне решить мою проблему? Заранее спасибо за советы и ответы!



Последнее исправление: aarexer (всего исправлений: 2)

Привет! Пусть у меня есть сообщения:

Пусть у тебя лучше будет нормальное оформление кода

Siado ★★★★★
()

ЯННП ты хочешь в PB сделать сообщение по-умолчанию? или это питон какой-то уже?

вообще в той же С++ можео сделать что-то типа

msg.mutable_body( )->mutable__SystemStarted( );

только я все равно ННП зачем тебе пустое сообщение.

anonymous
()
Ответ на: комментарий от aarexer

всеравно ННП

message cool_mess {
    message system_started{ }
    message header { }
    message body { 
        optional system_started ss = 1;
    }
    optional header head = 1;
    optional body   bod  = 2;
}

так чтоль?

капча drgria (drageria?) что-то подозревает

anonymous
()
Ответ на: комментарий от anonymous

Нет. Есть сообщение - Message. У него два обязательных поля - заголовок и тело. Тело - это либо Error, либо SystemStarted, либо SystemStoped. В данном случае, SystemStarted - это message SystemStarted {}. Т.е:

Message {
MessageHeader
{
   id = 1
}
MessageBody
{
SystemStarted
{
}
}
Я не понимаю, как в MessageBody выставить SystemStarted. Если бы SystemStarted был бы не пустой, типа
message SystemStarted
{
 required uint32      id         = 1;
}
То тут понятно как делать:
msg = Message()
msg.header.id = 12
msg.body._SystemStarted.id  = 20
и было бы как я хочу. Но у меня оно пустое. Вот я не понимаю как его выставить в body.

aarexer
() автор топика
Ответ на: комментарий от aarexer
msg = Message()
msg.header.id = 12
msg.body._SystemStarted.id  = 20

вот это на каком языке код? питон?

anonymous
()

Код отформатируй. А oneof это просто группировка. Поля такого не создается. То есть msg.body._SystemStarted нет, есть msg._SystemStarted.

ei-grad ★★★★★
()

у меня под рукой нет щас на чем проверить, но чисто ради интереса

msg.body._SystemStarted.CopyFrom(Message.SystemStarted())
сработает?

anonymous
()
Ответ на: комментарий от aarexer

Нет. Таких полей в сообщении protobuf нет. Это просто логическая группировка. Можно использовать для WhichOneOf например. Если через и них можно получить доступ к дочерним полям то это сахар. И он может не работать, или работать не так как кажется правильным. В разных версиях protobuf по разному было.

ei-grad ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.