コード例 #1
0
        protected internal override ExternalReference <T> Deserialize(IntermediateReader input, ContentSerializerAttribute format, ExternalReference <T> existingInstance)
        {
            var result = existingInstance ?? new ExternalReference <T>();

            input.ReadExternalReference(result);
            return(result);
        }
コード例 #2
0
        protected internal override List <T> Deserialize(IntermediateReader input, ContentSerializerAttribute format, List <T> existingInstance)
        {
            var result = existingInstance ?? new List <T>();

            if (_itemSerializer is ElementSerializer <T> elementSerializer)
            {
                elementSerializer.Deserialize(input, result);
            }
            else
            {
                // Create the item serializer attribute.
                var itemFormat = new ContentSerializerAttribute
                {
                    ElementName = format.CollectionItemName
                };

                // Read all the items.
                while (input.MoveToElement(itemFormat.ElementName))
                {
                    var value = input.ReadObject <T>(itemFormat, _itemSerializer);
                    result.Add(value);
                }
            }

            return(result);
        }
コード例 #3
0
 public void Deserialize(IntermediateReader input, object collection, ContentSerializerAttribute format)
 {
     var itemFormat = new ContentSerializerAttribute
     {
         ElementName = format.CollectionItemName
     };
     while (input.MoveToElement(format.CollectionItemName))
         _addMethod.Invoke(collection, new[] { input.ReadObject<object>(itemFormat, _contentSerializer) });
 }
コード例 #4
0
        protected internal override T[] Deserialize(IntermediateReader input, ContentSerializerAttribute format, T[] existingInstance)
        {
            if (existingInstance != null)
            {
                throw new InvalidOperationException("You cannot deserialize an array into a getter-only property.");
            }
            var result = _listSerializer.Deserialize(input, format, null);

            return(result.ToArray());
        }
コード例 #5
0
        protected internal override object Deserialize(IntermediateReader input, ContentSerializerAttribute format, object existingInstance)
        {
            var str = input.Xml.ReadString();

            try
            {
                return(Enum.Parse(TargetType, str, true));
            }
            catch (Exception ex)
            {
                throw input.Exception_InvalidContent(ex, "Invalid enum value '{0}' for type '{1}'", str, TargetType.Name);
            }
        }
コード例 #6
0
        protected internal override T Deserialize(
            IntermediateReader input, ContentSerializerAttribute format, T existingInstance)
        {
            var elements = PackedElementsHelper.ReadElements(input);

            if (elements.Length < _elementCount)
            {
                ThrowElementCountException();
            }

            var index = 0;

            return(Deserialize(elements, ref index));
        }
コード例 #7
0
        protected internal void Deserialize(IntermediateReader input, List <T> results)
        {
            var elements = PackedElementsHelper.ReadElements(input);

            for (var index = 0; index < elements.Length;)
            {
                if (elements.Length - index < _elementCount)
                {
                    ThrowElementCountException();
                }

                var elem = Deserialize(elements, ref index);
                results.Add(elem);
            }
        }
コード例 #8
0
        protected internal override Dictionary <TKey, TValue> Deserialize(IntermediateReader input, ContentSerializerAttribute format, Dictionary <TKey, TValue> existingInstance)
        {
            var result = existingInstance ?? new Dictionary <TKey, TValue>();

            while (input.MoveToElement(format.CollectionItemName))
            {
                input.Xml.ReadStartElement();

                var key   = input.ReadObject <TKey>(_keyFormat, _keySerializer);
                var value = input.ReadObject <TValue>(_valueFormat, _valueSerializer);
                result.Add(key, value);

                input.Xml.ReadEndElement();
            }

            return(result);
        }
コード例 #9
0
        protected internal override CurveKeyCollection Deserialize(
            IntermediateReader input,
            ContentSerializerAttribute format,
            CurveKeyCollection existingInstance)
        {
            var result = existingInstance ?? new CurveKeyCollection();

            if (input.Xml.HasValue)
            {
                var elements = PackedElementsHelper.ReadElements(input);
                if (elements.Length > 0)
                {
                    // Each CurveKey consists of 5 elements
                    if (elements.Length % 5 != 0)
                    {
                        throw new InvalidContentException(
                                  "Elements count in CurveKeyCollection is inncorect!");
                    }
                    try
                    {
                        // Parse all CurveKeys
                        for (int i = 0; i < elements.Length; i += 5)
                        {
                            // Order: Position, Value, TangentIn, TangentOut and Continuity
                            var curveKey = new CurveKey
                                               (XmlConvert.ToSingle(elements[i]),
                                               XmlConvert.ToSingle(elements[i + 1]),
                                               XmlConvert.ToSingle(elements[i + 2]),
                                               XmlConvert.ToSingle(elements[i + 3]),
                                               (CurveContinuity)Enum.Parse(
                                                   typeof(CurveContinuity),
                                                   elements[i + 4],
                                                   true));
                            result.Add(curveKey);
                        }
                    }
                    catch (Exception e)
                    {
                        throw new InvalidContentException
                                  ("Error parsing CurveKey", e);
                    }
                }
            }
            return(result);
        }
コード例 #10
0
        public static T Deserialize <T>(XmlReader input, string referenceRelocationPath)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            var serializer = new IntermediateSerializer();
            var reader     = new IntermediateReader(serializer, input, referenceRelocationPath);
            T   asset;

            try
            {
                if (!reader.MoveToElement("XnaContent"))
                {
                    throw new InvalidContentException(
                              $"Could not find XnaContent element in '{referenceRelocationPath}'.");
                }

                // Initialize the namespace lookups from
                // the attributes on the XnaContent element.
                serializer.CreateNamespaceLookup(input);

                // Move past the XnaContent.
                input.ReadStartElement();

                // Read the asset.
                var format = new ContentSerializerAttribute {
                    ElementName = "Asset"
                };
                asset = reader.ReadObject <T>(format);

                // Process the shared resources and external references.
                reader.ReadSharedResources();
                reader.ReadExternalReferences();

                // Move past the closing XnaContent element.
                input.ReadEndElement();
            }
            catch (XmlException xmlException)
            {
                throw reader.Exception_InvalidContent(xmlException, "An error occured parsing.");
            }
            return(asset);
        }
コード例 #11
0
        protected internal override object Deserialize(
            IntermediateReader input, ContentSerializerAttribute format, object existingInstance)
        {
            var result = (IList)(existingInstance ?? Activator.CreateInstance(TargetType));

            // Create the item serializer attribute.
            var itemFormat = new ContentSerializerAttribute
            {
                ElementName = format.CollectionItemName
            };

            // Read all the items.
            while (input.MoveToElement(itemFormat.ElementName))
            {
                var value = input.ReadObject <object>(itemFormat);
                result.Add(value);
            }

            return(result);
        }
コード例 #12
0
        internal static string[] ReadElements(IntermediateReader input)
        {
            if (input.Xml.IsEmptyElement)
            {
                return(Array.Empty <string>());
            }

            string str = string.Empty;

            while (input.Xml.NodeType != XmlNodeType.EndElement)
            {
                if (input.Xml.NodeType == XmlNodeType.Comment)
                {
                    input.Xml.Read();
                }
                else
                {
                    str += input.Xml.ReadString();
                }
            }

            // Special case for char ' '
            if (str.Length > 0 && string.IsNullOrWhiteSpace(str))
            {
                return new string[] { str }
            }
            ;

            var elements = str.Split(_separators, StringSplitOptions.RemoveEmptyEntries);

            if (elements.Length == 1 && string.IsNullOrEmpty(elements[0]))
            {
                return(Array.Empty <string>());
            }

            return(elements);
        }
コード例 #13
0
 protected internal override T?Deserialize(IntermediateReader input, ContentSerializerAttribute format, T?existingInstance)
 {
     return(input.ReadRawObject <T>(_format, _serializer));
 }
コード例 #14
0
        protected internal override object Deserialize(IntermediateReader input, ContentSerializerAttribute format, object existingInstance)
        {
            var cast = existingInstance == null ? default : (T)existingInstance;

                       return(Deserialize(input, format, cast));
        }
コード例 #15
0
 protected internal abstract T Deserialize(IntermediateReader input, ContentSerializerAttribute format, T existingInstance);
コード例 #16
0
        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 input.Exception_InvalidContent(null, "The Xml element `{0}` is required, but element `{1}` was found at line {2}:{3}. Try changing the element order or adding missing elements.", info.Attribute.ElementName, input.Xml.Name, ((IXmlLineInfo)input.Xml).LineNumber, ((IXmlLineInfo)input.Xml).LinePosition);
                    }
                }

                if (info.Attribute.SharedResource)
                {
                    input.ReadSharedResource(info.Attribute, (object o) => info.Setter(result, o));
                }
                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);
                }
            }

            if (_collectionHelper != null)
            {
                _collectionHelper.Deserialize(input, result, format);
            }

            return(result);
        }