我一直在寻找这个,但却找不到任何东西。
我正在尝试使用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)
我知道乍一看可能很复杂,但也许它真的很简单?我错过了什么吗?
提前致谢!
答案 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,额外的格式化字符不是一大笔开销,所以我发现这是一个可接受的解决方法。