0

しばらくこれを探していましたが、何も見つかりませんでした。

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) の 2 つの頂点とそれらの間のエッジを取得しました。それらをデシリアライズすると、エッジは問題ありませんが、頂点は (0,12,0) と (1,12,1) になります。私が見逃しているものがあるはずです(12個はmakeTestメソッドから来ています)が、cos変数にはグラフの「頂点」の頂点の位置と同じように0と1しかありません(それがMessageBoxに表示されているものです)

一見すると複雑かもしれませんが、本当に単純なのでしょうか? 何か不足していますか?

前もって感謝します!

4

2 に答える 2

0

私の調査によると、これはライブラリのバグです (または、このライブラリを適切に使用できない人が増えています)。 これは、他の人が私と同じ問題を経験しているライブラリ フォーラムでのディスカッションの 1 つです。

このため、LINQ to XML でコードを作成し、手動で実行しました。通常の XML をナビゲートするのと同じように機能します。覚えておくべきことの 1 つは、適切な XNames を使用することです。文字列を要素名として使用するとうまくいかないからです。例えば:

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

あなたが私と同じ問題を抱えているなら、頑張ってください-私があなたを少し助けてくれることを願っています:)

于 2014-03-23T18:30:21.560 に答える
0

今日、この同じ問題を発見し、この投稿を見つける前に別の回避策を見つけました。

GraphMLSerializer による XML 出力を調べていると、xml をきれいに印刷した後、適切に逆シリアル化されていることに気付きました (XML を読みやすくするために Notepad++ プラグインを使用していました)。そのため、シリアル化コードにわずかな変更を加え、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 のみをロードするだけであり、余分な書式設定文字は圧倒的な量のオーバーヘッドではないため、これは許容できる回避策であることがわかりました。

于 2014-04-02T23:30:22.230 に答える