internal void WriteObjectInternal(object value, ContentSerializerAttribute format, ContentTypeSerializer typeSerializer, Type declaredType) { if (format.Optional && (value == null || typeSerializer.ObjectIsEmpty(value))) { return; } var isReferenceObject = false; if (value != null && !typeSerializer.TargetType.IsValueType) { if (_currentObjectStack.Contains(value)) { throw new InvalidOperationException("Cyclic reference found during serialization. You may be missing a [ContentSerializer(SharedResource=true)] attribute."); } _currentObjectStack.Push(value); isReferenceObject = true; } if (!format.FlattenContent) { Xml.WriteStartElement(format.ElementName); if (value == null) { if (!format.AllowNull) { throw new InvalidOperationException(string.Format("Element {0} cannot be null.", format.ElementName)); } Xml.WriteAttributeString("Null", "true"); } else if (value.GetType() != typeSerializer.TargetType && !IsNullableType(declaredType)) { Xml.WriteStartAttribute("Type"); WriteTypeName(value.GetType()); Xml.WriteEndAttribute(); typeSerializer = Serializer.GetTypeSerializer(value.GetType()); } } if (value != null && !typeSerializer.ObjectIsEmpty(value)) { typeSerializer.Serialize(this, value, format); } if (!format.FlattenContent) { Xml.WriteEndElement(); } if (isReferenceObject) { _currentObjectStack.Pop(); } }
public override bool ObjectIsEmpty(object value) { if (_baseSerializer != null) { return(_baseSerializer.ObjectIsEmpty(value)); } return(false); }