Отправка сообщения Protobuf из C # в python - PullRequest
0 голосов
/ 03 мая 2019

У меня есть простой класс с двумя полями в файле proto: (proto3)

enum MaestroMsgType
{
    EVAL = 0;
    GET_ACK = 1;
    GET_AN = 2;
}

message MaestroMsg
{
    MaestroMsgType msgType = 1;
    string maestroMsg = 2;
}

Я пытаюсь отправить (с netMQ, но это менее важно) форму класса C # на python. Но в python при попытке вернуть данные обратно в формат класса это не получается.

Отправка в C #:

  MaestroMsg maestroMsg = new MaestroMsg
  {
       MaestroMsg_ = "someMessage",
       MsgType = MaestroMsgType.GET_AN,
   };
   string messageToSend = maestroMsg.ToString();
   NetMQMessage msg = new NetMQMessage();
   msg.Append(messageToSend);
   _pubSocket.SendMultipartMessage(msg);

Код в python, получающий сообщение:

 received_message = sub_socket.recv_multipart()
 maestroMsg_object = MaestroMsg()
 maestroMsg_object.ParseFromString(received_message.encode())

И я получаю это сообщение об ошибке:

 google.protobuf.message.DecodeError: Error parsing message

Я понятия не имею, что я делаю неправильно. Спасибо за ответы.

1 Ответ

1 голос
/ 06 мая 2019

Таким образом, благодаря @MarcGravell, ответ был просто неправильным использованием API:

C #:

MaestroMsg maestroMsg = new MaestroMsg
{
    MaestroMsg_ = maestroMsgStr,
    MsgType = maestroMsgType,
};

var messageToSend = maestroMsg.ToByteArray();
NetMQMessage msg = new NetMQMessage();
msg.Append(messageToSend);

_pubSocket.SendMultipartMessage (msg);

python:

received_message = sub_socket.recv_multipart()
meastro_object = MaestroMsg()
meastro_object.ParseFromString(received_message)
...