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