public void WriteXml(XmlWriter writer)
        {
            TypeXmlAttributes xmlInfo_graph    = TypeDescriptorTools.GetXmlInfo(typeof(DirectedGraph));
            TypeXmlAttributes xmlInfo_node     = TypeDescriptorTools.GetXmlInfo(typeof(Node));
            TypeXmlAttributes xmlInfo_link     = TypeDescriptorTools.GetXmlInfo(typeof(Link));
            TypeXmlAttributes xmlInfo_category = TypeDescriptorTools.GetXmlInfo(typeof(Category));
            TypeXmlAttributes xmlInfo_property = TypeDescriptorTools.GetXmlInfo(typeof(Property));



            //  writer.WriteStartDocument();

            //writer.WriteStartElement(nameof(DirectedGraph));

            this.WriteElementAttributes(writer, xmlInfo_graph);

            writer.WriteStartElement(nameof(Nodes));
            foreach (Node n in Nodes)
            {
                n.WriteXml(writer, xmlInfo_node);
            }
            writer.WriteEndElement();

            writer.WriteStartElement(nameof(Links));
            foreach (Link n in Links)
            {
                n.WriteXml(writer, xmlInfo_link);
            }
            writer.WriteEndElement();

            writer.WriteStartElement(nameof(Categories));
            foreach (Category n in Categories)
            {
                n.WriteXml(writer, xmlInfo_category);
            }
            writer.WriteEndElement();

            writer.WriteStartElement(nameof(Properties));
            foreach (Property n in PropertyDeclaration)
            {
                n.WriteXml(writer, xmlInfo_property);
            }
            writer.WriteEndElement();

            //   writer.WriteEndElement();

            //   writer.WriteEndDocument();
        }
        public void ReadXml(XmlReader reader)
        {
            TypeXmlAttributes xmlInfo_graph    = TypeDescriptorTools.GetXmlInfo(typeof(DirectedGraph));
            TypeXmlAttributes xmlInfo_node     = TypeDescriptorTools.GetXmlInfo(typeof(Node));
            TypeXmlAttributes xmlInfo_link     = TypeDescriptorTools.GetXmlInfo(typeof(Link));
            TypeXmlAttributes xmlInfo_category = TypeDescriptorTools.GetXmlInfo(typeof(Category));
            TypeXmlAttributes xmlInfo_property = TypeDescriptorTools.GetXmlInfo(typeof(Property));



            DirectedGraphXmlExtensions.ReadElementAttributes(this, reader, xmlInfo_graph);

            reader.Read();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                    switch (reader.Name)
                    {
                    case nameof(Node):
                        var tmpNode = new Node();
                        tmpNode.ReadXml(reader, xmlInfo_node);
                        Nodes.Add(tmpNode);
                        break;

                    case nameof(Link):
                        var newLink = new Link();

                        newLink.ReadXml(reader, xmlInfo_link);
                        Links.Add(newLink);
                        break;

                    case nameof(Category):
                        var newCategory = new Category();
                        newCategory.ReadXml(reader, xmlInfo_category);
                        Categories.Add(newCategory);
                        break;

                    case nameof(Property):
                        var newProperty = new Property();
                        newProperty.ReadXml(reader, xmlInfo_property);
                        PropertyDeclaration.Add(newProperty);
                        break;

                    //case nameof(Nodes):
                    //    do
                    //    {
                    //        var newNode = new Node();
                    //        newNode.ReadXml(reader, xmlInfo_node);
                    //        Nodes.Add(newNode);

                    //    } while (reader.ReadToNextSibling(nameof(Node)));

                    //    break;
                    //case nameof(Links):
                    //    do
                    //    {
                    //        var newLink = new Link();

                    //        newLink.ReadXml(reader, xmlInfo_link);
                    //        Links.Add(newLink);

                    //    } while (reader.ReadToNextSibling(nameof(Link)));
                    //    reader.ReadEndElement();
                    //    break;
                    //case nameof(Categories):
                    //    do
                    //    {
                    //        var newCategory = new Category();
                    //        newCategory.ReadXml(reader, xmlInfo_category);
                    //        Categories.Add(newCategory);

                    //    } while (reader.ReadToNextSibling(nameof(Category)));
                    //    break;
                    //case nameof(Properties):
                    //    do
                    //    {
                    //        var newProperty = new Property();
                    //        newProperty.ReadXml(reader, xmlInfo_property);
                    //        PropertyDeclaration.Add(newProperty);

                    //    } while (reader.ReadToNextSibling(nameof(Property)));

                    //    break;
                    default:

                        break;
                    }
                    break;

                default:
                case XmlNodeType.Text:
                    break;

                case XmlNodeType.CDATA:
                    break;

                case XmlNodeType.ProcessingInstruction:
                    break;

                case XmlNodeType.Comment:
                    break;

                case XmlNodeType.XmlDeclaration:
                    break;

                case XmlNodeType.Document:
                    break;

                case XmlNodeType.DocumentType:
                    break;

                case XmlNodeType.EntityReference:
                    break;

                case XmlNodeType.EndElement:
                    break;
                }
            }

            //reader.ReadStartElement(nameof(Nodes));

            //reader.ReadEndElement();


            //reader.ReadStartElement(nameof(Links));


            //reader.
            //reader.ReadStartElement(nameof(Categories));

            //reader.ReadEndElement();

            //reader.ReadStartElement(nameof(Properties));

            //reader.ReadEndElement();
        }