2011-12-09 12 views
5

Ho una struttura di dati del grafico che vorrei codificare con protocol buffers. Ci sono connessioni cicliche tra i vertici del grafico. Esiste un modo standard/comune per codificare tali strutture in protobuf? Un approccio che viene in mente è quello di aggiungere un campo "id" a ciascun vertice, e usare quegli id ​​al posto dei puntatori. Es .:Codifica delle strutture di dati ciclici (ad esempio grafici diretti) utilizzando i buffer di protocollo

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; 
} 

Poi ho potuto scrivere le classi che avvolgono le classi protobuf generati, e convertire automaticamente questi identificatori ai puntatori reali su deserializzazione (e di nuovo a ids sulla serializzazione). È questo l'approccio migliore? Se è così, allora qualcuno sa di progetti esistenti che usano/documentano questo approccio? In caso contrario, quale approccio consiglieresti?

risposta

2

Se è necessario il supporto multipiattaforma, quindi utilizzare un DTO come si propone nella domanda, quindi il mapping da/a un modello separato basato su grafico nel proprio codice è probabilmente l'approccio migliore.

Come nota a margine, in protobuf-net (C#/.net) ho aggiunto il supporto per questo che aggiunge uno strato di astrazione in silenzio. Fondamentalmente, i seguenti lavori:

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

Interessante. Ho bisogno del supporto multipiattaforma, quindi probabilmente non posso usare l'estensione protobuf-net. Ma sono curioso di sapere come lo hai implementato - cioè, cosa c'è sotto il tuo livello di astrazione? –

+1

@Edward fondamentalmente, ognuno è nidificato in modo silenzioso all'interno di un messaggio con un idref (un collegamento a un oggetto preesistente tramite chiave), o un id (nuova chiave generata dal serializzatore) e un sotto-messaggio. Ma poiché il motore serializza lo gestisce, l'implementazione è opaca per l'utente –

Problemi correlati