private XElement SerializeBase(object obj)
{
if (obj == null)
return new XElement(m_udtWrapper.Alias);
if (!m_type.IsInstanceOfType(obj))
throw new YAXObjectTypeMismatch(m_type, obj.GetType());
FindDocumentDefaultNamespace();
// to serialize stand-alone collection or dictionary objects
if (m_udtWrapper.IsTreatedAsDictionary)
{
var elemResult = MakeDictionaryElement(null, m_udtWrapper.Alias, obj,
m_udtWrapper.DictionaryAttributeInstance, m_udtWrapper.CollectionAttributeInstance);
if (m_udtWrapper.PreservesWhitespace)
XMLUtils.AddPreserveSpaceAttribute(elemResult);
if (elemResult.Parent == null)
AddNamespacesToElement(elemResult);
return elemResult;
}
else if (m_udtWrapper.IsTreatedAsCollection)
{
var elemResult = MakeCollectionElement(null, m_udtWrapper.Alias, obj, null, null);
if (m_udtWrapper.PreservesWhitespace)
XMLUtils.AddPreserveSpaceAttribute(elemResult);
if (elemResult.Parent == null)
AddNamespacesToElement(elemResult);
return elemResult;
}
else if(ReflectionUtils.IsBasicType(m_udtWrapper.UnderlyingType))
{
bool dummyAlreadyAdded;
var elemResult = MakeBaseElement(null, m_udtWrapper.Alias, obj, out dummyAlreadyAdded);
if (m_udtWrapper.PreservesWhitespace)
XMLUtils.AddPreserveSpaceAttribute(elemResult);
if (elemResult.Parent == null)
AddNamespacesToElement(elemResult);
return elemResult;
}
else if(!m_udtWrapper.UnderlyingType.EqualsOrIsNullableOf(obj.GetType()))
{
// this block of code runs if the serializer is instantiated with a
// another base value such as System.Object but is provided with an
// object of its child
var ser = NewInternalSerializer(obj.GetType(), TypeNamespace, null);
var xdoc = ser.SerializeToXDocument(obj);
var elem = xdoc.Root;
// do not pop from stack because the new internal serializer was sufficient for the whole serialization
// and this instance of serializer did not do anything extra
FinalizeNewSerializer(ser, importNamespaces: true, popFromSerializationStack: false);
elem.Name = m_udtWrapper.Alias;
elem.AddAttributeNamespaceSafe(m_yaxLibNamespaceUri + m_trueTypeAttrName, obj.GetType().FullName, m_documentDefaultNamespace);
RegisterYaxLibNamespace();
AddNamespacesToElement(elem);
return elem;
}
else
{
// SerializeBase will add the object to the stack
var elem = SerializeBase(obj, m_udtWrapper.Alias);
if (!m_type.IsValueType)
m_serializedStack.Pop();
Debug.Assert(m_serializedStack.Count == 0, "Serialization stack is not empty at the end of serialization");
return elem;
}
}