question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

[BUG] SerializeGraph does not include TaggedEdge data

See original GitHub issue

Describe the bug Serializing a graph to GraphML, discards TaggedEdge data.

To Reproduce Steps to reproduce the behavior:

  1. Make a graph (I tested with BidirectionalGraph)
  2. Use TaggedEdge
  3. Use graph.SerializeToGraphML
  4. See that the graphml does not have the edge data

Expected behavior Edge data to be included in the graphml as specified here: http://graphml.graphdrawing.org/primer/graphml-primer.html#AttributesDefinition

Additional context Example code to reproduce this problem

Example code:
using System;
using System.Xml;
using QuikGraph;
using QuikGraph.Serialization;
using System.Xml.Serialization;
using System.IO;


namespace Test {
    public class Test {
        public static void Main() {
            var graph = new BidirectionalGraph<Node, TaggedEdge<Node, EdgeData>>();
            Node node1 = new Node(1, 2);
            Node node2 = new Node(1, 3);
            graph.AddVertex(node1);
            graph.AddVertex(node2);
            graph.AddEdge(new TaggedEdge<Node, EdgeData>(node1, node2, new EdgeData(1)));

            Save(graph);
        }


        private static void Save(BidirectionalGraph<Node, TaggedEdge<Node, EdgeData>> graph) {
            XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
            xmlWriterSettings.NewLineOnAttributes = true;
            xmlWriterSettings.Indent = true;
            var sw = new StringWriter();
            XmlWriter writer = XmlWriter.Create(sw, xmlWriterSettings);
            graph.SerializeToGraphML<Node, TaggedEdge<Node, EdgeData>,
                BidirectionalGraph<Node, TaggedEdge<Node, EdgeData>>>(writer);
            writer.Close();
            Console.Write(sw.ToString());
        }
    }

    public class EdgeData {
        [XmlAttribute("weight")]
        public float weight { get; set; }

        public EdgeData(float weight) {
            this.weight = weight;
        }
    }

    public class Node {
        [XmlAttribute("x")]
        public float x { get; set; }

        [XmlAttribute("y")]
        public float y { get; set; }

        public Node(float x, float y) {
            this.x = x;
            this.y = y;
        }
    }
}

This code will print out:

<?xml version="1.0" encoding="utf-16"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <key
    id="x"
    for="node"
    attr.name="x"
    attr.type="float" />
  <key
    id="y"
    for="node"
    attr.name="y"
    attr.type="float" />
  <graph
    id="G"
    edgedefault="directed"
    parse.nodes="2"
    parse.edges="1"
    parse.order="nodesfirst"
    parse.nodeids="free"
    parse.edgeids="free">
    <node
      id="0">
      <data
        key="x">1</data>
      <data
        key="y">2</data>
    </node>
    <node
      id="1">
      <data
        key="x">1</data>
      <data
        key="y">3</data>
    </node>
    <edge
      id="0"
      source="0"
      target="1" />
  </graph>
</graphml>

See that this holds vertex data, but no edge data.

Issue Analytics

  • State:open
  • Created 2 years ago
  • Comments:5 (3 by maintainers)

github_iconTop GitHub Comments

3reactions
KeRNeLithcommented, Jun 10, 2021

So I dug a bit in the code related to the GraphML serializer and the problem you’re facing is because the serializer indeed not takes into account properties of unsupported types (types specified by the GraphML documentation) and also is limited to properties directly declared in the Edge type you are using. This means that

// This will work
public class CustomEdge : Edge<Node>
{
    [XmlAttribute("weight")]
    public float weight { get; set; }
}

// This will NOT work
public class Data
{
    [XmlAttribute("weight")]
    public float weight { get; set; }
}

public class CustomEdge : TaggedEdge<Node, Data>
{
}

Of course it would be better to have both working. I will try to add support of this. Note that if you have some start of work on the subject feel free to suggest it.

2reactions
Celsiussscommented, Jun 12, 2021

@KeRNeLith yeah that should not be too much of a problem for me. Appreciate your help and effort on this project 😃

Read more comments on GitHub >

github_iconTop Results From Across the Web

Issues · KeRNeLith/QuikGraph
Generic Graph Data Structures and Algorithms for . ... [Bug] EdgeDepthFirstSearchAlgorithm does not find multiple paths when the root vertex has multiple ...
Read more >
How to serialize additional edge information in QuickGraph?
To solve this problem, I created my own edge implementation pretty similar to the TaggedEdge mentioned above: public class DataEdge<TVertex> ...
Read more >
The quikgraph from KeRNeLith - Coder Social
[BUG] SerializeGraph does not include TaggedEdge data. Describe the bug. Serializing a graph to GraphML, discards TaggedEdge data. To Reproduce
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found