示例#1
0
        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);
        }
示例#3
0
        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);
        }