private XmlObjectSerialization BuildXmlObjectSerialization(ObjectSchema objectSchema, ObjectType objectType) { List <XmlObjectElementSerialization> elements = new List <XmlObjectElementSerialization>(); List <XmlObjectAttributeSerialization> attributes = new List <XmlObjectAttributeSerialization>(); List <XmlObjectArraySerialization> embeddedArrays = new List <XmlObjectArraySerialization>(); foreach (var objectTypeLevel in objectType.EnumerateHierarchy()) { foreach (ObjectTypeProperty objectProperty in objectTypeLevel.Properties) { var property = objectProperty.SchemaProperty; if (property == null) { continue; } var name = property.SerializedName; var isAttribute = property.Schema.Serialization?.Xml?.Attribute == true; if (isAttribute) { attributes.Add( new XmlObjectAttributeSerialization( name, objectProperty, BuildXmlValueSerialization(property.Schema, objectProperty.Declaration.Type) ) ); } else { XmlElementSerialization valueSerialization = BuildXmlElementSerialization(property.Schema, objectProperty.Declaration.Type, name, false); if (valueSerialization is XmlArraySerialization arraySerialization) { embeddedArrays.Add(new XmlObjectArraySerialization(objectProperty, arraySerialization)); } else { elements.Add( new XmlObjectElementSerialization( objectProperty, valueSerialization ) ); } } } } return(new XmlObjectSerialization( objectSchema.Serialization?.Xml?.Name ?? objectSchema.Language.Default.Name, objectType.Type, elements.ToArray(), attributes.ToArray(), embeddedArrays.ToArray() )); }
private void WriteXmlDeserialize(CodeWriter writer, ObjectType model, XmlElementSerialization serialization) { using (writer.Scope($"internal static {model.Type} Deserialize{model.Declaration.Name}({typeof(XElement)} element)")) { writer.ToDeserializeCall( serialization, w => w.AppendRaw("element"), (w, v) => w.Line($"return {v};"), true); } writer.Line(); }
private void WriteXmlSerialize(CodeWriter writer, XmlElementSerialization serialization) { const string namehint = "nameHint"; writer.Append($"void {typeof(IXmlSerializable)}.{nameof(IXmlSerializable.Write)}({typeof(XmlWriter)} writer, {typeof(string)} {namehint})"); using (writer.Scope()) { writer.ToSerializeCall( serialization, w => w.AppendRaw("this"), null, w => w.AppendRaw(namehint)); } writer.Line(); }
public static void ToSerializeCall(this CodeWriter writer, XmlElementSerialization serialization, CodeWriterDelegate name, CodeWriterDelegate?writerName = null, CodeWriterDelegate?nameHint = null) { writerName ??= w => w.AppendRaw("writer"); switch (serialization) { case XmlArraySerialization array: if (array.Wrapped) { writer.Line($"{writerName}.WriteStartElement({array.Name:L});"); } var itemVariable = new CodeWriterDeclaration("item"); using (writer.Scope($"foreach (var {itemVariable:D} in {name})")) { writer.ToSerializeCall( array.ValueSerialization, w => w.Append($"{itemVariable}"), writerName); } if (array.Wrapped) { writer.Line($"{writerName}.WriteEndElement();"); } break; case XmlDictionarySerialization dictionarySerialization: var pairVariable = new CodeWriterDeclaration("pair"); using (writer.Scope($"foreach (var {pairVariable:D} in {name})")) { writer.ToSerializeCall( dictionarySerialization.ValueSerialization, w => w.Append($"{pairVariable}.Value"), writerName); } break; case XmlObjectSerialization objectSerialization: if (nameHint != null) { writer.Line($"{writerName}.WriteStartElement({nameHint} ?? {objectSerialization.Name:L});"); } else { writer.Line($"{writerName}.WriteStartElement({objectSerialization.Name:L});"); } CodeWriter.CodeWriterScope?CheckPropertyForNull(ObjectTypeProperty objectTypeProperty) { return(objectTypeProperty.Declaration.Type.IsNullable ? writer.Scope($"if ({objectTypeProperty.Declaration.Name} != null)") : default); } foreach (XmlObjectAttributeSerialization property in objectSerialization.Attributes) { using (CheckPropertyForNull(property.Property)) { writer.Line($"{writerName}.WriteStartAttribute({property.Name:L});"); writer.ToSerializeValueCall( w => w.Append($"{property.Property.Declaration.Name}"), writerName, property.ValueSerialization); writer.Line($"{writerName}.WriteEndAttribute();"); } } foreach (XmlObjectElementSerialization property in objectSerialization.Elements) { using (CheckPropertyForNull(property.Property)) { writer.ToSerializeCall( property.ValueSerialization, w => w.Append($"{property.Property.Declaration.Name}")); } } foreach (XmlObjectArraySerialization property in objectSerialization.EmbeddedArrays) { using (CheckPropertyForNull(property.Property)) { writer.ToSerializeCall( property.ArraySerialization, w => w.Append($"{property.Property.Declaration.Name}")); } } writer.Line($"{writerName}.WriteEndElement();"); return;