Google-protobuf: cómo crear uniones utilizando el búfer de protocolo de Google

2 minutos de lectura

Avatar de usuario de Sphoorthi Dayanand
Sphoorthi Dayanand

Actualmente estoy tratando de usar Google Protocol Buffers para el lenguaje C. No estoy seguro de cómo crear una unión C usando GPB.

Por ejemplo, con un archivo proto de la siguiente manera:

message msgToSend
{
 required Type msg_type=1; //Type is a predefined enum to determine message type
 optional ReqMsg1 msg1=2;
 optional ReqMsg2 msg2=3;
}

Espero arriba para generar un union tras la compilación, pero se genera una estructura de la siguiente manera:

struct _msgToSend
{
 ProtobufCMessage base;
 Type msg_type;
 ReqMsg1 msg1;
 ReqMsg2 msg2;
}

  • Considere aceptar esta respuesta que menciona oneof. No puedo eliminar mi respuesta aceptada.

    – relajarse

    18 oct 2016 a las 8:56

Avatar de usuario de Quarra
Quarra

En protobuf hay una estructura dedicada para eso (aunque la estoy usando en C++, no estoy seguro de si funcionará en C puro):

message MyUnion {
    oneof MyUnionOneof {
        bool booleanValue = 1;
        string stringValue = 2;
    }
}

Echa un vistazo a este enlace: https://developers.google.com/protocol-buffers/docs/proto#oneof

No creo que puedas.

En Protobuf, “opcional” no significa “es esto o esto otro” como con las uniones C; significa “esto podría estar aquí”. Es por eso que está obteniendo una estructura C que puede expresar que ambos campos opcionales están presentes.

En el trabajo, esto solo fue suficiente para que implementara un sistema de reemplazo de Protobuf, ya que realmente queríamos sindicatos.

  • ¡bien! ya que finalmente solo se empaquetan los datos completos

    – Sphoorthi Dayanand

    14 de marzo de 2016 a las 6:56

  • tal vez comprobar developers.google.com/protocol-buffers/docs/proto#oneof para sindicatos

    – Quarra

    18 oct 2016 a las 8:40

  • @Quarra Ooh, no sabía nada de eso. ¿Es (muy) nuevo? Intenté resolverlo pero fallé (no sigo a Protobuf).

    – relajarse

    18 oct 2016 a las 8:53

  • @unwind Estoy usando protobuf 2.6.1 en este momento en mi proyecto y uno de ellos ya está allí. 2.6.1 fue lanzado el 21 de octubre de 2014 AFAIK. Oneofs están en la Guía de idiomas para proto2, así que asumo que oneofs estaban allí desde la versión 2.0.0.

    – Quarra

    19 oct 2016 a las 9:37

  • De acuerdo con esta respuesta, oneof se lanzó con 2.6.0, que salió 2014-08-15 stackoverflow.com/a/20985344/306

    – número1

    10 de febrero de 2017 a las 15:13


¿Ha sido útil esta solución?