2014-03-30 32 views
1

我有,可能有不同的邏輯含義邊的圖的數據集,這樣的工作:如何序列化QuickGraph中的附加邊緣信息?

"Bavaria" -[PART_OF]-> "Germany" 
"Germany" -[NEIGHBOR_OF]-> "France" 

我使用QuickGraph.TaggedEdge其中TTag泛型參數代表這個領域是一個string

QuickGraph.BidirectionalGraph<IGeographicalUnit, TaggedEdge<IGeographicalUnit, string>> 

這工作完全直到那一刻我嘗試我的圖表序列化到.graphml形式:

using (var w = XmlWriter.Create(@"C:\Temp\data.graphml")) 
{ 
    _graph.SerializeToGraphML<IGeographicalUnit, TaggedEdge<IGeographicalUnit, string>, BidirectionalGraph<IGeographicalUnit, TaggedEdge<IGeographicalUnit, string>>>(w); 
} 

序列化的邊緣數據不包含任何標記信息,只有源和目標:

<edge id="0" source="0" target="1" /> 

我想是這樣的:

<edge id="0" source="0" target="1" tag="PART_OF" /> 

所以,問題是,我怎麼能強制執行此標籤被序列化?

回答

1

爲了解決這個問題,我創建了自己的優勢實現相當類似上面提到的TaggedEdge

public class DataEdge<TVertex> : Edge<TVertex> 
{ 
    [XmlAttribute("Tag")] 
    public string Tag { get; set; } 

    public DataEdge(TVertex source, TVertex target) 
     : base(source, target) { } 

    public DataEdge(TVertex source, TVertex target, string tag) 
     : this(source, target) 
    { 
     Tag = tag; 
    } 
} 

然後我換成TaggedEdge出現與我DataEdge。在此之後,系列化產生了以下XML輸出:

<edge id="0" source="0" target="1"> 
    <data key="Tag">PART_OF</data> 
</edge> 

問題是解決了,但我希望另一種解決方案存在不涉及編寫自己的Edge實現。