tengo un modelo interno de datos existente para un Picture
, de la siguiente manera:Protocol Buffers y modelos de datos internos
package test.model;
public class Picture {
private int height, width;
private Format format;
public enum Format {
JPEG, BMP, GIF
}
// Constructor, getters and setters, hashCode, equals, toString etc.
}
ahora quiero serializarlo usando protocol buffers. He escrito un archivo Picture.proto que refleja los campos de la clase Picture
y compilado el código en el paquete test.model.protobuf
con un nombre de clase de PictureProtoBuf
:
package test.model.protobuf;
option java_package = "test.model.protobuf";
option java_outer_classname = "PictureProtoBuf";
message Picture {
enum Format {
JPEG = 1;
BMP = 2;
GIF = 3;
}
required uint32 width = 1;
required uint32 height = 2;
required Format format = 3;
}
Ahora Ahora estoy asumiendo que si tengo una Picture
que Quiero serializar y enviar algún lugar tengo que crear un objeto PictureProtoBuf
y mapear todos los campos de ancho, de este modo:
Picture p = new Picture(100, 200, Picture.JPEG);
PictureProtoBuf.Picture.Builder output = PictureProtoBuf.Picture.newBuilder();
output.setHeight(p.getHeight());
output.setWidth(p.getWidth());
estoy que se despegue cuando tengo una enumeración en mi modelo de datos. La forma más fea que estoy usando en este momento es:
output.setFormat(PictureProtoBuf.Picture.Format.valueOf(p.getFormat().name());
Sin embargo, esto es propenso a la rotura y se basa en el nombre de enumeración ser coherente entre mi modelo de datos interno y el modelo de datos del búfer de protocolo (que no es una gran suposición ya que los nombres de enumeración dentro de los archivos .proto deben ser únicos). Puedo ver que tengo que crear manualmente instrucciones de conmutación en enumeraciones si la llamada .name()
del modelo interno no coincide con el nombre de enumeración generado por protobuf.
Supongo que mi pregunta es si voy por esto de la manera correcta? ¿Se supone que debo eliminar mi modelo de datos interno (test.model.Picture
) a favor del generado por protobuf (test.model.protobuf.PictureProtoBuf
)? De ser así, ¿cómo puedo implementar algunas de las sutilezas que he hecho en mi modelo de datos interno (por ejemplo, hashCode()
, equals(Object)
, toString()
, etc.)?
No lo he probado (solo porque soy principalmente una persona .NET), pero I * believe * [protostuff] (http://code.google.com/p/protostuff/) le permite seguir trabajando con su modelo existente. –
¡Gracias, lo comprobaré! – Catchwa
@MarcGravell - Gracias por su sugerencia. Tu corazonada era correcta; Protostuff hace exactamente lo que yo quería, pero conserva los búferes de protocolo en el back-end (aunque aún no ha probado su compatibilidad con la biblioteca de protobuf de Google). – Catchwa