我正在处理一个图形数据集,它可能具有不同逻辑含义的边缘,如:
"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" />
所以,问题是,如何强制将此标记序列化?
答案 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
实现。