void WriteMemberElement (XmlTypeMapElementInfo elem, object memberValue)
{
switch (elem.TypeData.SchemaType)
{
case SchemaTypes.XmlNode:
string elemName = elem.WrappedElement ? elem.ElementName : "";
if (_format == SerializationFormat.Literal) WriteElementLiteral(((XmlNode)memberValue), elemName, elem.Namespace, elem.IsNullable, false);
else WriteElementEncoded(((XmlNode)memberValue), elemName, elem.Namespace, elem.IsNullable, false);
break;
case SchemaTypes.Enum:
case SchemaTypes.Primitive:
if (_format == SerializationFormat.Literal)
WritePrimitiveValueLiteral (memberValue, elem.ElementName, elem.Namespace, elem.MappedType, elem.TypeData, elem.WrappedElement, elem.IsNullable);
else
WritePrimitiveValueEncoded (memberValue, elem.ElementName, elem.Namespace, new XmlQualifiedName (elem.DataTypeName, elem.DataTypeNamespace), elem.MappedType, elem.TypeData, elem.WrappedElement, elem.IsNullable);
break;
case SchemaTypes.Array:
if (memberValue == null) {
if (!elem.IsNullable) return;
if (_format == SerializationFormat.Literal) WriteNullTagLiteral (elem.ElementName, elem.Namespace);
else WriteNullTagEncoded (elem.ElementName, elem.Namespace);
}
else if (elem.MappedType.MultiReferenceType)
WriteReferencingElement (elem.ElementName, elem.Namespace, memberValue, elem.IsNullable);
else {
WriteStartElement(elem.ElementName, elem.Namespace, memberValue);
WriteListContent (null, elem.TypeData, (ListMap) elem.MappedType.ObjectMap, memberValue, null);
WriteEndElement (memberValue);
}
break;
case SchemaTypes.Class:
if (elem.MappedType.MultiReferenceType) {
if (elem.MappedType.TypeData.Type == typeof(object))
WritePotentiallyReferencingElement (elem.ElementName, elem.Namespace, memberValue, null, false, elem.IsNullable);
else
WriteReferencingElement (elem.ElementName, elem.Namespace, memberValue, elem.IsNullable);
}
else WriteObject (elem.MappedType, memberValue, elem.ElementName, elem.Namespace, elem.IsNullable, false, true);
break;
case SchemaTypes.XmlSerializable:
// bug #419973
if (!elem.MappedType.TypeData.Type.IsInstanceOfType (memberValue))
memberValue = ImplicitConvert (memberValue, elem.MappedType.TypeData.Type);
WriteSerializable ((IXmlSerializable) memberValue, elem.ElementName, elem.Namespace, elem.IsNullable);
break;
default:
throw new NotSupportedException ("Invalid value type");
}
}