如何在QuickGraph中序列化其他边缘信息?

时间:2014-03-30 13:26:40

标签: serialization 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 个答案:

答案 0 :(得分: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实现。