2010-11-01 21 views
5

quiero usar protobuff en una aplicación Java para facilitar la serialización y tengo una pregunta acerca de esta cita desde el sitio web de Googleserialización Java con búfer de protocolo de

Protocol Buffers y Diseño OO clases búfer de protocolo son básicamente titulares de datos tontos (como estructuras en C++); no hacen buenos ciudadanos de primera clase en un modelo de objetos. Si desea agregar un comportamiento más rico a una clase generada , la mejor manera de hacerlo es para envolver la clase de memoria de protocolo generada en una clase específica de la aplicación . El ajuste de los buffers de protocolo también es una buena idea si no tiene control sobre el diseño del archivo .proto (si, por ejemplo, está reutilizando uno de otro proyecto ). En ese caso, puede utilizar la clase contenedora para elaborar una interfaz más adecuado para el entorno único de su aplicación: ocultar algunos datos y métodos, exponiendo funciones de confort, etc. Debe nunca agregue el comportamiento a la generada clases heredando de ellas. Este romperá los mecanismos internos y es no buena práctica orientada a objetos de todos modos.

de: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

¿Qué quiere decir cuando se dice que envuelva la clase creada?

+0

mira envoltorio de diseño de patrón, también conocido como adaptador http://en.wikipedia.org/wiki/Adapter_pattern – none

Respuesta

9

Perspectiva 1

se escribe un archivo de .proto y darle a Protoc que genera el código del constructor. Sugieren no agregar ningún método al código generado. Si desea que se agregue algún comportamiento personalizado al código generado, ESCRIBA SU PROPIA CLASE ENVOLVIENDO el código generado.

Por ejemplo, digamos que la clase generada por el protocolo es MyMessageBuilder. Y quería agregar un método que pueda tomar la entrada XML y escindir el mensaje específico de protobuff. Debería escribir un XmlToMyMessageBuilder como a continuación. Aquí XmlToMyMessageBuilder, su clase está envolviendo el código generado y agregando un comportamiento personalizado desde XML().

public class XmlToMyMessageBuilder 
{ 
private final MyMessageBuilder protoBuilder; 

public MyMessage fromXml(byte[] input() 
{ 
protoBuilder.setXXX(); 
} 
} 

Este es un buen principio general de programación.

Perspectiva 2

Al proporcionar un intermediario también puede desacoplar el código del mecanismo de serialización subyacente. Esto le permite cambiar las implementaciones del serializador (digamos que desea serializar una carga útil donde todos los datos están en formato de cadena ... donde la serialización JSON con compresión es una mejor alternativa) con bajo impacto. Se podría hacer algo como esto

public interface MySerializer 
{ 
boolean serialize(MyDomainObject input); 
} 

public PBBasedSerializer implements MySerializer 
{ 
private final MyMessageBuilder protoBuilder; 
... 
} 

public JsonBasedSerializer implements MySerializer 
{ 
private final JSONSerializer jsonSerializer; 
... 
} 
-1

¿Qué quiere decir cuando dice que envuelva la clase creada?

Te están entregando una clase, envuélvela con un propósito de clase creado para lo que estás haciendo. No interactúe con una instancia de clase sin procesar de la biblioteca.

+0

@Bill: me opongo. Las respuestas del Maestro Wu fueron realmente bastante perspicaces y de actualidad. (y también entretenido) Se acercaron a tratar la programación como un Arte Zen (como debería ser), en lugar de "¿qué pasa con el código?" eso sucede frecuentemente en SO. – abelenky

+2

@abelenky: Mucha gente no está de acuerdo. Ninguna de las respuestas que eliminé en realidad respondía una pregunta. Tenemos un estándar más alto que simplemente "entretenido" aquí en SO. Si hubiera sido solo una o dos respuestas, probablemente habría volado, pero este no es realmente el lugar para una cuenta de novedad que no sirve para nada. –

+2

@abelenky: Además, siéntase libre de marcar "wahts teh codez?" preguntas de estilo para su eliminación también. –

3

Significa que implementaría su propia clase que contiene un objeto de búfer de protocolo como un campo privado.

Las clases de buffer de protocolo se generan a partir de archivos .proto. Estas clases generadas tienen todos los métodos para manipular directamente los campos que contienen. Pero no tienen métodos que sirvan para operaciones de mayor nivel que solo modificar un campo.

Su clase contenedora puede proporcionar una interfaz más rica o más restringida para los usuarios de su API. Como cualquier modificación del buffer de protocolo necesita pasar por el objeto de envoltura, usted tiene control total sobre qué operaciones desea admitir.

+0

Bueno, los mensajes generados son inmutables por lo que no podemos cambiar los campos, ¿verdad? –

+0

Si desea modificar el contenido, use los constructores en su lugar. – MForster

Cuestiones relacionadas