2014-03-07 61 views
0

我一直在尋找這個,但coudn't找不到任何東西。Quickgraph GraphML反序列化中的頂點工廠

我想在C#中使用Quickgraph從GraphML反序列化圖。下面是我用它來代表頂點類和邊緣

[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文件中,我得到了2個頂點 - (0,0,0)和(1,1,1)以及它們之間的邊。當我反序列化它們時,邊只是很好,但頂點走(0,12,0)和(1,12,1)。必須有我缺少的東西(十二個來自makeTest方法),但cos變量只有數字零和一個就像圖的「頂點」中的頂點位置(這就是我在MessageBox中顯示的內容)

我知道它乍一看可能很複雜,但也許它很簡單?我錯過了什麼嗎?

提前致謝!

回答

0

根據我的研究,這是庫中的一個bug(或者有更多的人不能正確使用這個庫)。 Here是圖書館論壇上討論的問題之一,其他人也遇到與我相同的問題。

正因爲如此,我在LINQ to XML中創建了一個代碼並手動完成 - 它的工作就像通過普通的XML進行導航一樣。需要記住的一件事是使用適當的XName,因爲使用字符串作爲元素名稱根本不起作用。例如:

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

祝你好運,如果你有這個同樣的問題我 - 希望我確實幫助你一點:)

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發射本身,額外的格式化字符並不是壓倒性的開銷,所以我發現這是一個可以接受的解決方法。