2011-12-09 4 views
5

protocol buffersでエンコードしたいグラフデータ構造があります。グラフの頂点間には循環的な接続があります。 protobufでそのような構造をコード化するための標準/共通の方法はありますか?考えられる1つのアプローチは、各頂点に「id」フィールドを追加し、ポインタの代わりにこれらのIDを使用することです。例えば:プロトコルバッファを使用した循環データ構造(有向グラフなど)の符号化

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

それから私はいるProtobufで生成されたクラスをラップするクラスを書くことができ、かつ自動的にこれらの識別子は、実際のデシリアライゼーション上のポインタ(とバックシリアライズのIDへの)に変換します。これが最善のアプローチですか?もしそうなら、誰もこのアプローチを使用/文書化している既存のプロジェクトを知っていますか?そうでない場合は、どのようなアプローチをお勧めしますか?

答えて

2

クロスプラットフォームサポートが必要な場合は、質問で提案するようにDTOを使用して、独自のコードで別のグラフベースモデルとのマッピングを(おそらく)にしてください。

protobuf-net(c#/ .net)で私はこれをサポートしました。これは抽象レイヤーをサイレントに追加します。基本的には、以下の作品があります。

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

興味深い。私はクロスプラットフォームサポートが必要なので、おそらくprotobuf-net拡張を使用することはできません。しかし、私はそれをどのように実装したか、つまり抽象レイヤの下にあるものについて興味がありますか? –

+1

@Edwardは、基本的に、idref(キーを介して既存のオブジェクトへのリンク)、またはid(シリアライザによって生成された新しいキー)とサブメッセージを含むメッセージ内に静かにネストされます。しかし、シリアライズエンジンがそれを処理するため、実装はユーザーに対して不透明です –

関連する問題