예제 #1
0
        protected internal override void Serialize(IntermediateWriter output, object value, ContentSerializerAttribute format)
        {
            // First serialize the base type.
            if (_baseSerializer != null)
            {
                _baseSerializer.Serialize(output, value, format);
            }

            // Now serialize our own elements.
            foreach (var info in _elements)
            {
                var elementValue = info.Getter(value);

                if (info.Attribute.SharedResource)
                {
                    output.WriteSharedResource(elementValue, info.Attribute);
                }
                else
                {
                    output.WriteObjectInternal(elementValue, info.Attribute, info.Serializer, info.Serializer.TargetType);
                }
            }

            if (_collectionHelper != null)
            {
                _collectionHelper.Serialize(output, value, format);
            }
        }
예제 #2
0
 public void WriteObject <T>(T value, ContentSerializerAttribute format, ContentTypeSerializer typeSerializer)
 {
     Xml.WriteStartElement(format.ElementName);
     Xml.WriteAttributeString("Type", typeSerializer.XmlTypeName);
     typeSerializer.Serialize(this, value, format);
     Xml.WriteEndElement();
 }
        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 void WriteRawObject <T>(T value, ContentSerializerAttribute format, ContentTypeSerializer typeSerializer)
        {
            if (!format.FlattenContent)
            {
                Xml.WriteStartElement(format.ElementName);
            }

            typeSerializer.Serialize(this, value, format);

            if (!format.FlattenContent)
            {
                Xml.WriteEndElement();
            }
        }