public void WriteXml(XmlWriter writer, object value, XmlSerializationContext context) { if (context.Member.MappingType != XmlMappingType.Element) { throw new XmlSerializationException($"XML mapping of \"{context.ValueType}\" must be Element."); } var collectionItem = GetCollectionItem(context); if (collectionItem == null) { throw new XmlSerializationException( $"XML contract of \"{context.ValueType}\" must contains collection item"); } Type lastItemType = null; XmlTypeContext typeContext = null; foreach (var item in (IEnumerable)value) { if (item == null) { context.WriteNull(writer, collectionItem.ValueType, collectionItem); } else { var member = (XmlMember)collectionItem; var shouldWriteTypeName = context.TryResolveValueType(item, ref member, out Type itemType); if (itemType != lastItemType) { typeContext = context.Settings.GetTypeContext(itemType); lastItemType = itemType; } writer.WriteStartElement(member.Name); if (shouldWriteTypeName) { context.WriteTypeName(writer, lastItemType); } context.WriteXml(writer, item, member, typeContext); writer.WriteEndElement(); } } }