public T ReadRawObject <T>(ContentSerializerAttribute format, ContentTypeSerializer typeSerializer, T existingInstance) { if (format.FlattenContent) { Xml.MoveToContent(); return((T)typeSerializer.Deserialize(this, format, existingInstance)); } if (!MoveToElement(format.ElementName)) { throw NewInvalidContentException(null, "Element '{0}' was not found.", format.ElementName); } var isEmpty = Xml.IsEmptyElement; if (!isEmpty) { Xml.ReadStartElement(); } var result = typeSerializer.Deserialize(this, format, existingInstance); if (isEmpty) { Xml.Skip(); } if (!isEmpty) { Xml.ReadEndElement(); } return((T)result); }
protected internal override object Deserialize(IntermediateReader input, ContentSerializerAttribute format, object existingInstance) { var result = existingInstance; if (result == null) { try { result = Activator.CreateInstance(TargetType, true); } catch (MissingMethodException e) { throw new Exception(string.Format("Couldn't create object of type {0}: {1}", TargetType.Name, e.Message), e); } } // First deserialize the base type. if (_baseSerializer != null) { _baseSerializer.Deserialize(input, format, result); } // Now deserialize our own elements. foreach (var info in _elements) { if (!info.Attribute.FlattenContent) { if (!input.MoveToElement(info.Attribute.ElementName)) { // If the the element was optional then we can // safely skip it and continue. if (info.Attribute.Optional) { continue; } // We failed to find a required element. throw new InvalidContentException(string.Format("The Xml element `{0}` is required!", info.Attribute.ElementName)); } } if (info.Attribute.SharedResource) { Action <object> fixup = (o) => info.Setter(result, o); input.ReadSharedResource(info.Attribute, fixup); } else if (info.Setter == null) { var value = info.Getter(result); input.ReadObject(info.Attribute, info.Serializer, value); } else { var value = input.ReadObject <object>(info.Attribute, info.Serializer); info.Setter(result, value); } } return(result); }
public T ReadRawObject <T>(ContentSerializerAttribute format, ContentTypeSerializer typeSerializer, T existingInstance) { if (format.FlattenContent) { Xml.MoveToContent(); return((T)typeSerializer.Deserialize(this, format, existingInstance)); } if (!MoveToElement(format.ElementName)) { throw new InvalidContentException(string.Format("Element `{0}` was not found in `{1}`.", format.ElementName, _filePath)); } Xml.ReadStartElement(); var result = typeSerializer.Deserialize(this, format, existingInstance); Xml.ReadEndElement(); return((T)result); }