2011-12-09 9 views
5

Tengo una estructura de datos de gráficos que me gustaría codificar con protocol buffers. Hay conexiones cíclicas entre los vértices del gráfico. ¿Existe una forma estándar/común para codificar tales estructuras en protobuf? Un enfoque que viene a la mente es agregar un campo "id" a cada vértice y usar esos identificadores en lugar de punteros. Ej .:Codificación de estructuras de datos cíclicos (por ejemplo, gráficos dirigidos) utilizando memorias intermedias de protocolo

message Vertex { 
    required int32 id = 1; 
    required string label = 2; 
    repeated int32 outgoing_edges = 3; // values should be id's of other nodes 
} 

message Graph { 
    repeated Vertex vertices = 1; 
} 

entonces podría escribir clases que envuelven las clases generadas protobuf-, y automáticamente se convierten estos identificadores a los punteros reales de deserialización (y de nuevo a las identificaciones en la serialización). ¿Es este el mejor enfoque? Si es así, ¿alguien sabe de proyectos existentes que usan/documentan este enfoque? Si no, ¿qué enfoque recomendaría usted?

Respuesta

2

Si necesita soporte multiplataforma, entonces usando una DTO como propone en la pregunta, entonces mapear eso a/desde un modelo separado basado en gráficos en su propio código es probablemente su mejor enfoque.

Como nota al margen, en protobuf-net (C#/.net) he agregado soporte para esto que agrega una capa de abstracción silenciosamente. Básicamente, los siguientes trabajos:

[ProtoContract] 
class Vertex { 
    ... 
    [ProtoMember(3, AsReference = true)] 
    public List<Vertex> OutgoingEdges {get;set;} 
} 
+0

Interesante. Necesito soporte multiplataforma, por lo que probablemente no pueda usar su extensión protobuf-net. Pero tengo curiosidad sobre cómo lo implementó, es decir, ¿qué hay debajo de su capa de abstracción? –

+1

@Edward básicamente, cada uno está silenciosamente anidado dentro de un mensaje con un idref (un enlace a un objeto preexistente mediante la clave), o una identificación (nueva clave generada por el serializador) y un submensaje. Pero debido a que el motor de serialización lo maneja, la implementación es opaca para el usuario –

Cuestiones relacionadas