private SerializeBase ( object obj ) : XElement | ||
obj | object | The object to be serialized |
return | XElement |
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;
}
}
YAXSerializer::SerializeBase ( object obj, XName className ) : XElement |
/// <summary> /// Makes an XML element with the specified name, corresponding to the object specified. /// </summary> /// <param name="insertionLocation">The insertion location.</param> /// <param name="name">The name of the element.</param> /// <param name="value">The object to be serialized in an XML element.</param> /// <param name="alreadyAdded">if set to <c>true</c> specifies the element returned is /// already added to the parent element and should not be added once more.</param> /// <returns> /// an instance of <c>XElement</c> which will contain the serialized object, /// or <c>null</c> if the serialized object is already added to the base element /// </returns> private XElement MakeBaseElement(XElement insertionLocation, XName name, object value, out bool alreadyAdded) { alreadyAdded = false; if (value == null || ReflectionUtils.IsBasicType(value.GetType())) { if (value != null) value = value.ToXmlValue(); return new XElement(name, value); } else if (ReflectionUtils.IsStringConvertibleIFormattable(value.GetType())) { object elementValue = value.GetType().InvokeMember("ToString", BindingFlags.InvokeMethod, null, value, new object[0]); return new XElement(name, elementValue); } else { YAXSerializer ser = new YAXSerializer(value.GetType(), m_exceptionPolicy, m_defaultExceptionType, m_serializationOption); ser.SetNamespaceToOverrideEmptyNamespace(name.Namespace); ser.SetBaseElement(insertionLocation); XElement elem = ser.SerializeBase(value, name); ImportNamespaces(ser); m_parsingErrors.AddRange(ser.ParsingErrors); alreadyAdded = true; return elem; } }