public void Serialize(XmlWriter writer, object element)
        {
            var sContext = VgXmlSerializerContext.CreateWriterContext(this, writer);

            if (writer.WriteState == WriteState.Start)
            {
                SerializeRoot(writer, element, element.GetType().Name);
                return;
            }

            var pContexts = CreatePropertyContexts(element.GetType());

            //write attributes first
            foreach (var pContext in pContexts.Where(p => p.EntityType == VgXmlEntityType.Attribute))
            {
                pContext.GetContentFactory().WriteFromProperty(sContext, pContext.WithTarget(element));
            }

            //then write other entities
            foreach (var pContext in pContexts.Where(p => p.EntityType != VgXmlEntityType.Attribute))
            {
                pContext.GetContentFactory().WriteFromProperty(sContext, pContext.WithTarget(element));
            }

            writer.Flush();
        }
        public object Deserialize(XmlReader reader, Type type)
        {
            var sContext = VgXmlSerializerContext.CreateReaderContext(this, reader);

            var retElement = Activator.CreateInstance(type);

            var isEmpty = reader.IsEmptyElement;

            var pContexts = CreatePropertyContexts(type);

            //Read Attributes
            for (int i = 0; i < reader.AttributeCount; i++)
            {
                reader.MoveToAttribute(i);

                var pContext = pContexts.FirstOrDefault(p => p.EntityType == VgXmlEntityType.Attribute && p.NameMatches(reader.Name)) ??
                               throw new InvalidOperationException($"No matching Property found on type {type.Name} for Attribute {reader.Name}.");

                pContext.GetContentFactory().ReadIntoProperty(sContext, pContext.WithTarget(retElement));
            }

            reader.ReadStartElement();

            if (isEmpty)
            {
                return(retElement);
            }

            while (reader.IsStartElement())
            {
                var pContext = pContexts.FirstOrDefault(p => p.EntityType == VgXmlEntityType.Element && p.NameMatches(reader.Name)) ??
                               throw new InvalidOperationException($"No matching Property found on type {type.Name} for Element {reader.Name}.");

                pContext.GetContentFactory().ReadIntoProperty(sContext, pContext.WithTarget(retElement));
            }

            reader.ReadEndElement();

            return(retElement);
        }