示例#1
0
        public bool Deserialize(XmlReader reader, IXRoadSerializable dtoObject, IXmlTemplateNode templateNode, XRoadMessage message)
        {
            if (message.EnableFiltering && !filters.Contains(message.FilterName))
            {
                reader.ConsumeUnusedElement();
                return(false);
            }

            string typeAttribute;

            if (typeMap.Definition.IsAnonymous && !(typeMap is IArrayTypeMap) && (typeAttribute = reader.GetAttribute("type", NamespaceConstants.XSI)) != null)
            {
                throw XRoadException.InvalidQuery($"Expected anonymous type, but `{typeAttribute}` was given.");
            }

            var concreteTypeMap = (typeMap.Definition.IsInheritable ? serializerCache.GetTypeMapFromXsiType(reader) : null) ?? typeMap;

            var propertyValue = concreteTypeMap.Deserialize(reader, templateNode, Definition, message);

            if (propertyValue == null)
            {
                return(true);
            }

            setValueMethod(dtoObject, propertyValue);

            return(true);
        }
示例#2
0
        public override object Deserialize(XmlReader reader, IXmlTemplateNode templateNode, IContentDefinition definition, XRoadMessage message)
        {
            if (reader.IsEmptyElement)
            {
                return(MoveNextAndReturn(reader, new T[0]));
            }

            var items = new List <T>();

            var parentDepth = definition.MergeContent ? reader.Depth - 1 : reader.Depth;
            var itemDepth   = parentDepth + 1;
            var itemName    = definition.ArrayItemDefinition.Name.LocalName;

            if (!definition.MergeContent)
            {
                reader.Read();
            }

            while (parentDepth < reader.Depth)
            {
                if (reader.NodeType != XmlNodeType.Element || reader.Depth != itemDepth)
                {
                    reader.Read();
                    continue;
                }

                if (reader.LocalName != itemName)
                {
                    if (definition.MergeContent)
                    {
                        break;
                    }

                    if (!definition.ArrayItemDefinition.AcceptAnyName)
                    {
                        throw new Exception($"Invalid array item name {reader.LocalName}.");
                    }
                }

                if (reader.IsNilElement())
                {
                    items.Add(default(T));
                    reader.Read();
                    continue;
                }

                var typeMap = serializerCache.GetTypeMapFromXsiType(reader) ?? elementTypeMap;

                var value = typeMap.Deserialize(reader, templateNode, definition.ArrayItemDefinition, message);

                items.Add(value == null ? default(T) : (T)value);
            }

            return(items.ToArray());
        }
示例#3
0
        private object DeserializeValue(XmlReader reader, ITypeMap typeMap, IXmlTemplateNode templateNode, IContentDefinition contentDefinition, XRoadMessage message)
        {
            if (reader.IsNilElement())
            {
                reader.ReadToEndElement();
                return(null);
            }

            string typeAttribute;

            if (typeMap.Definition.IsAnonymous && !(typeMap is IArrayTypeMap) && (typeAttribute = reader.GetAttribute("type", NamespaceConstants.XSI)) != null)
            {
                throw XRoadException.InvalidQuery($"Expected anonymous type, but `{typeAttribute}` was given.");
            }

            var concreteTypeMap = typeMap;

            if (!contentDefinition.IgnoreExplicitType)
            {
                concreteTypeMap = (typeMap.Definition.IsInheritable ? serializerCache.GetTypeMapFromXsiType(reader) : null) ?? typeMap;
            }

            return(concreteTypeMap.Deserialize(reader, templateNode, contentDefinition, message));
        }