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();
            }
        }
예제 #2
0
 public override bool ObjectIsEmpty(object value)
 {
     if (_baseSerializer != null)
     {
         return(_baseSerializer.ObjectIsEmpty(value));
     }
     return(false);
 }