Quickgraph GraphML反序列化中的顶点工厂

时间:2014-03-07 15:19:26

标签: c# xml serialization graphml quickgraph

我一直在寻找这个,但却找不到任何东西。

我正在尝试使用C#中的Quickgraph从GraphML反序列化图形。这是我用来表示Vertex和Edge

的类
[Serializable]
public class Room
{
    public Room(int id, double x, double y)
    {
        this.Ids = id;
        this.x = x;
        this.y = y;
    }

    [XmlAttribute("id")]
    public int Ids { get; set; }

    [XmlAttribute]
    public double x { get; set; }

    [XmlAttribute]
    public double y { get; set; }

}

[Serializable]
public class HouseEdge<TVertex> : Edge<TVertex>
{
    public string Name { get; set; }

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

我正在尝试使用DeserializeFromGraphML方法反序列化代码:

XmlReader xreader = getXMLReader("//house.xml");
IdentifiableVertexFactory<Room> ivf = new IdentifiableVertexFactory<Room>(makeTest);
IdentifiableEdgeFactory<Room, HouseEdge<Room>> ief = new IdentifiableEdgeFactory<Room, HouseEdge<Room>>(makeTest2);
graph.DeserializeFromGraphML<Room, HouseEdge<Room>, AdjacencyGraph<Room, HouseEdge<Room>>>(xreader, ivf, ief);
xreader.Close();

这是makeTest和makeTest2的代码:

private Room makeTest(string cos)
{
    MessageBox.Show(cos);
    return new Room(11, 12.0, 13.0);
}

private HouseEdge<Room> makeTest2(Room one, Room two, string cos)
{
    MessageBox.Show(cos);
    return new HouseEdge<Room>(one, two);
}

所以 - 在我的XML文件中,我有两个顶点 - (0,0,0)和(1,1,1)以及它们之间的边缘。当我反序列化它们时,边缘很好但顶点变为(0,12,0)和(1,12,1)。必须有一些我缺少的东西(十二个来自makeTest方法),但cos变量只有数字零,一个就像图形“顶点”中的顶点位置一样(这就是我所展示的内容)的MessageBox)

我知道乍一看可能很复杂,但也许它真的很简单?我错过了什么吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

根据我的研究,这是库中的一个错误(或者有更多人无法正确使用此库)。 Here是图书馆论坛上的讨论之一,其他小伙子也遇到了与我相同的问题。

正因为如此,我在LINQ to XML中创建了一个代码并手动完成 - 它的工作就像浏览普通的XML一样。要记住的一件事是使用正确的XNames,因为使用字符串作为元素名称根本不起作用。例如:

XName XNgraph = XName.Get("graph", "http://graphml.graphdrawing.org/xmlns");
var edges = xelement.Elements(XNgraph)

祝你好运,如果你和我有同样的问题 - 希望我能帮到你一点点:)

答案 1 :(得分:0)

我今天发现了同样的问题,并在找到这篇文章之前找到了不同的解决方法,以防它对任何人都有用。

当我正在检查GraphMLSerializer的XML输出时,我注意到在我完全打印xml之后它正确地反序列化(我使用Notepad ++插件来使XML更容易阅读)。所以我实际上通过对我的序列化代码稍作修改来解决这个问题,为我的XmlWriter添加了一些设置,以便它可以完美地打印它发出的XML:

using (XmlWriter writer = XmlWriter.Create(filename, new XmlWriterSettings { 
        Indent = true,
        WriteEndDocumentOnClose = false
    })) {

    this.SerializeToGraphML<StoryNode, Choice, StoryArcGraph>(writer, 
        v => v.Id,
        e => e.Id
        );
}

我的项目只是加载自己发出的XML,额外的格式化字符不是一大笔开销,所以我发现这是一个可接受的解决方法。