2011-05-10 20 views
6

¿Está bien tener un mensaje como este?Campos autorreferenciales en mensajes protobuf

message A { 
    required int64 some_number = 1; 
    // .... some more fields 
    optional A sub_a = 123; 
} 

La razón es mi tiendas protocolo actual set de una forma directa, y envolviendo una de otra en el mensaje dará lugar a conversiones masivas de datos almacenados.

2.2.0 protoc lo compila bien. ¿Esto puede causar problemas con la serialización/deserialización y es compatible con protobuf-net?

Respuesta

7

Esa es una definición perfectamente bien, y debe trabajo en cualquier aplicación (incluyendo protobuf-net); ¿Ves algún problema? ¡SIN EMBARGO! es posible que desee considerar el impacto computacional de la serialización; en particular, para serializar un submensaje, debe conocerse el tamaño de los submensajes primero. Un método profundamente recursivo (según lo requiera esta lista vinculada) puede causar algunos problemas.

¿Hay alguna razón para que esto no sea simplemente un mensaje repeated? eso sería de lejos ser mi preferencia.

+0

El protocolo actual está enviando y almacenando mensajes A, no el envoltorio B con un campo A repetido. Cambiar el protocolo es mucho más trabajo que solo agregar campo a A. p. en el caso B tendré que convertir todos los datos almacenados a nuevos tipos de mensajes o admitir mensajes A y B. –

2

No sé acerca de protobuf-net, pero debería estar absolutamente bien. Sospecho que si no lo hace trabajo en protobuf-net, Marc contaría que como un error y solucionarlo ... eso es sin duda la actitud que tomaría en mi C# puerto :)

(Realista , No puedo ver fácilmente cómo sería un problema ... no es como si los mensajes fueran representados por estructuras, donde la recursión sería un problema.)

Debería ser muy fácil de probar - I Sugiérale que lo intente con un pequeño mensaje y vea si tiene algún problema. Todo lo que tienes que hacer es crear un mensaje y probar si puedes serializarlo y deserializarlo correctamente, posiblemente entre diferentes plataformas.

EDIT: Obviamente se necesita para asegurarse de que no hay ciclos reales en términos de los propios mensajes ...

+0

Quizás pueda ver algunos problemas si esto (una lista vinculada) es excesivamente largo ... –

+0

lo probé con la implementación de Google, no con el lado protobuf-net al que no tengo mucho acceso. –

+0

funcionó bien por cierto :) –

Cuestiones relacionadas