protobuf google array java protocol-buffers protocol-buffers-3

java - google - protobuf install linux



Herencia en búferes de protocolo. (2)

Protocol Buffers no admite la herencia. En su lugar, considera usar la composición:

message Foo { Bar bar = 1; string id = 2; }

Sin embargo, dicho esto, hay un truco que puedes usar que es como herencia, pero que es un truco feo, así que solo debes usarlo con cuidado. Si define sus tipos de mensajes como:

message Bar { string name = 1; } message Foo { string name = 1; string id = 2; }

Estos dos tipos son compatibles , porque Foo contiene un superconjunto de los campos de Bar . Esto significa que si tiene un mensaje codificado de un tipo, puede decodificarlo como el otro tipo. Si intenta decodificar una Bar como tipo Foo , la id del campo no se establecerá (y obtendrá su valor predeterminado). Si descodifica un Foo como tipo de Bar , la id del campo se ignorará. (Tenga en cuenta que estas son las mismas reglas que se aplican al agregar nuevos campos a un tipo a lo largo del tiempo).

Posiblemente puede usar esto para implementar algo como herencia, teniendo varios tipos, todos los cuales contienen una copia de los campos de la "superclase". Sin embargo, hay un par de grandes problemas con este enfoque:

  • Para convertir un objeto de mensaje de tipo Foo a tipo de Bar , debe serializar y volver a analizar; No puedes simplemente lanzar. Esto puede ser ineficiente.
  • Es muy difícil agregar nuevos campos a la superclase, porque debe asegurarse de agregar el campo a cada subclase y asegurarse de que esto no cree ningún conflicto de número de campo.

¿Cómo manejar la herencia en Google Protocol Buffers 3.0?

Código equivalente de Java:

public class Bar { String name; } public class Foo extends Bar { String id; }

¿Cuál sería el código equivalente de Proto?

message Bar { string name = 1; } message Foo { string id = 2; }


Vea el tutorial de los Fundamentos de Buffer de Protocolo :

Sin embargo, no vaya a buscar instalaciones similares a la herencia de clase: los buffers de protocolo no hacen eso.