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); } }
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(); } }