public override void Serialize(XmlWriter writer, T obj, XmlSerializableSettings settings) { if (obj != null) { var actualType = obj.GetType(); Tuple <String, IXmlSerializer> subTypeSerializer = null; if (actualType == typeof(T) || KnownTypeSerializers == null || !TryGetKnownTypeSerializer(actualType, out subTypeSerializer)) { // We're the actual serializer that should be used for this type. // Here comes the heavy lifting. foreach (var attributeMember in AttributeMembers.Values) { attributeMember.SerializeMember(writer, obj, settings); } foreach (var elementMemberGroup in ElementMembers) { foreach (var elementMember in elementMemberGroup) { elementMember.SerializeMember(writer, obj, settings); } } if (TextMember != null) { TextMember.SerializeMember(writer, obj, settings); } } else { writer.WriteAttributeString("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance", subTypeSerializer.Item1); subTypeSerializer.Item2.Serialize(writer, obj, settings); } } }
public abstract void Serialize(XmlWriter writer, Object obj, XmlSerializableSettings settings);
public void SerializeMember(XmlWriter writer, T instance, XmlSerializableSettings settings) { var val = this.Getter(instance); if (val != null) { switch (this.NodeType) { case XmlNodeType.Attribute: if (val != null) { writer.WriteStartAttribute(this.MemberName.Name, this.MemberName.Namespace); this.serializer.Serialize(writer, val, settings); writer.WriteEndAttribute(); } break; case XmlNodeType.Element: if (this.isCollection) { if (val != null || !settings.OmitNulls) { if (this.wrapCollection) { writer.WriteStartElement(this.MemberName.Name, this.MemberName.Namespace); } if (val != null) { this.serializer.Serialize(writer, val, settings); } else if (this.wrapCollection) { writer.WriteAttributeString("xsi", "nil", XsiNamespace, "true"); } if (this.wrapCollection) { writer.WriteEndElement(); } } } else { if (val != null || !settings.OmitNulls) { writer.WriteStartElement(this.MemberName.Name, this.MemberName.Namespace); if (val != null) { this.serializer.Serialize(writer, val, settings); } else { writer.WriteAttributeString("xsi", "nil", XsiNamespace, "true"); } } writer.WriteEndElement(); } break; case XmlNodeType.Text: if (val != null) { this.serializer.Serialize(writer, val, settings); } break; default: throw new NotSupportedException( String.Format("The node type {0} is not supported.", this.NodeType) ); } } }