protected virtual void WriteObject (XmlTypeMapping typeMap, object ob, string element, string namesp, bool isNullable, bool needType, bool writeWrappingElem)
{
if (ob == null)
{
if (isNullable)
{
if (_format == SerializationFormat.Literal) WriteNullTagLiteral(element, namesp);
else WriteNullTagEncoded (element, namesp);
}
return;
}
if (ob is XmlNode)
{
if (_format == SerializationFormat.Literal) WriteElementLiteral((XmlNode)ob, "", "", true, false);
else WriteElementEncoded((XmlNode)ob, "", "", true, false);
return;
}
if (typeMap.TypeData.SchemaType == SchemaTypes.XmlSerializable)
{
WriteSerializable ((IXmlSerializable)ob, element, namesp, isNullable);
return;
}
XmlTypeMapping map = typeMap.GetRealTypeMap (ob.GetType());
if (map == null)
{
// bug #81539
if (ob.GetType ().IsArray && typeof (XmlNode).IsAssignableFrom (ob.GetType ().GetElementType ())) {
Writer.WriteStartElement (element, namesp);
foreach (XmlNode node in (IEnumerable) ob)
node.WriteTo (Writer);
Writer.WriteEndElement ();
}
else
WriteTypedPrimitive (element, namesp, ob, true);
return;
}
if (writeWrappingElem)
{
if (map != typeMap || _format == SerializationFormat.Encoded) needType = true;
WriteStartElement (element, namesp, ob);
}
if (needType)
WriteXsiType(map.XmlType, map.XmlTypeNamespace);
switch (map.TypeData.SchemaType)
{
case SchemaTypes.Class: WriteObjectElement (map, ob, element, namesp); break;
case SchemaTypes.Array: WriteListElement (map, ob, element, namesp); break;
case SchemaTypes.Primitive: WritePrimitiveElement (map, ob, element, namesp); break;
case SchemaTypes.Enum: WriteEnumElement (map, ob, element, namesp); break;
}
if (writeWrappingElem)
WriteEndElement (ob);
}