나는 이것을 한동안 찾고 있었지만 아무것도 찾을 수 없었다.
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)이됩니다. 내가 놓친 것이 있어야합니다 (12 개는 makeTest 메서드에서 나옴). cos
변수는 그래프의 "Vertices"에서 꼭짓점의 위치와 같은 숫자 0과 1 만 가지고 있습니다 (이것이 MessageBox에 표시됩니다).
언뜻보기에는 복잡 할 수 있지만 정말 간단할까요? 내가 뭔가를 놓치고 있습니까?
미리 감사드립니다!
내 연구에 따르면 이것은 라이브러리의 버그입니다 (또는이 라이브러리를 제대로 사용할 수없는 사람들이 더 많습니다). 다음 은 다른 사람들이 나와 같은 문제를 경험하는 도서관 포럼의 토론 중 하나입니다.
이 때문에 LINQ to XML로 코드를 만들고 수동으로 수행했습니다. 일반 XML을 탐색하는 것과 같습니다. 기억해야 할 한 가지는 적절한 XNames를 사용하는 것입니다. 문자열을 요소 이름으로 사용하는 것은 단순히 작동하지 않기 때문입니다. 예를 들면 :
XName XNgraph = XName.Get("graph", "http://graphml.graphdrawing.org/xmlns");
var edges = xelement.Elements(XNgraph)
저와 같은 문제가 있으면 행운을 빕니다. 제가 조금 도와줬으면 좋겠습니다. :)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다