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); }