X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.XML%2FSystem.Xml.Serialization%2FXmlSerializationReaderInterpreter.cs;h=1853ad1497615a244b44df1c26ef7fe79b75d621;hb=f0d2ee46f839cc3cebcdaa674b3a31d9a3e22863;hp=3659e1d638fe3eeaf1666cc0e451d81d456295b3;hpb=b826dc791dd8639927b6f46962711abe8a1a3633;p=mono.git diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs index 3659e1d638f..1853ad14976 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs @@ -94,9 +94,6 @@ namespace System.Xml.Serialization object ReadEncodedObject (XmlTypeMapping typeMap) { -#if MOONLIGHT - throw new NotSupportedException (); -#else object ob = null; Reader.MoveToContent(); if (Reader.NodeType == System.Xml.XmlNodeType.Element) @@ -111,14 +108,10 @@ namespace System.Xml.Serialization ReadReferencedElements(); return ob; -#endif } protected virtual object ReadMessage (XmlMembersMapping typeMap) { -#if MOONLIGHT - throw new NotSupportedException (); -#else object[] parameters = new object[typeMap.Count]; if (typeMap.HasWrapperElement) @@ -175,7 +168,6 @@ namespace System.Xml.Serialization ReadReferencedElements(); return parameters; -#endif } object ReadRoot (XmlTypeMapping rootMap) @@ -186,7 +178,7 @@ namespace System.Xml.Serialization } else { - if (Reader.LocalName != rootMap.ElementName || Reader.NamespaceURI != rootMap.Namespace) + if (!rootMap.IsAny && (Reader.LocalName != rootMap.ElementName || Reader.NamespaceURI != rootMap.Namespace)) throw CreateUnknownNodeException(); return ReadObject (rootMap, rootMap.IsNullable, true); @@ -279,7 +271,6 @@ namespace System.Xml.Serialization nss.Add ("", Reader.Value); } } -#if !MOONLIGHT else if (anyAttrMember != null) { XmlAttribute attr = (XmlAttribute) Document.ReadNode(Reader); @@ -288,16 +279,13 @@ namespace System.Xml.Serialization } else ProcessUnknownAttribute(ob); -#endif } -#if !MOONLIGHT if (anyAttrMember != null) { anyAttributeArray = ShrinkArray ((Array)anyAttributeArray, anyAttributeIndex, anyAttrMember.TypeData.Type.GetElementType(), true); SetMemberValue (anyAttrMember, ob, anyAttributeArray, isValueList); } -#endif Reader.MoveToElement (); } @@ -381,7 +369,7 @@ namespace System.Xml.Serialization XmlTypeMapElementInfo info; if (readBySoapOrder) { - info = map.GetElement (Reader.LocalName, Reader.NamespaceURI); + info = map.GetElement (Reader.LocalName, Reader.NamespaceURI, ind); } else if (hasAnyReturnMember) { info = (XmlTypeMapElementInfo) ((XmlTypeMapMemberElement)map.ReturnMember).ElementInfo[0]; @@ -389,24 +377,24 @@ namespace System.Xml.Serialization } else { if (map.IsOrderDependentMap) { - info = map.GetElement (Reader.LocalName, Reader.NamespaceURI); + info = map.GetElement (Reader.LocalName, Reader.NamespaceURI, ind); } else - info = map.GetElement (Reader.LocalName, Reader.NamespaceURI, -1); + info = map.GetElement (Reader.LocalName, Reader.NamespaceURI); } if (info != null && !readFlag[info.Member.Index] ) { if (info.Member != previousMember) { - ind++; + ind = info.ExplicitOrder + 1; + // If the member is a flat list don't increase the index, since the next element may + // be another item of the list. This is a fix for Xamarin bug #9193. + if (info.Member is XmlTypeMapMemberFlatList) + ind--; previousMember = info.Member; } - if (readBySoapOrder && info.ExplicitOrder != ind) - throw new InvalidOperationException(string.Format("Element '{0}' has wrong order in sequence (expected - {1}, actual - {2}", Reader.LocalName, info.ExplicitOrder, ind)); - - if (info.Member.GetType() == typeof (XmlTypeMapMemberList)) { if (_format == SerializationFormat.Encoded && info.MultiReferenceType) @@ -522,10 +510,8 @@ namespace System.Xml.Serialization SetMemberValue (mem, ob, GetValueFromXmlString (Reader.ReadString(), info.TypeData, info.MappedType), isValueList); } } -#if !MOONLIGHT else UnknownNode(ob); -#endif Reader.MoveToContent(); } @@ -599,6 +585,10 @@ namespace System.Xml.Serialization void SetMemberValue (XmlTypeMapMember member, object ob, object value, bool isValueList) { + var memberType = member.TypeData.Type; + if (value != null && !value.GetType().IsAssignableFrom (memberType)) + value = XmlSerializationWriterInterpreter.ImplicitConvert (value, memberType); + if (isValueList) ((object[])ob)[member.GlobalIndex] = value; else @@ -764,11 +754,7 @@ namespace System.Xml.Serialization static object CreateInstance (Type type, bool nonPublic) { -#if MOONLIGHT - return Activator.CreateInstance (type); // always false -#else return Activator.CreateInstance (type, nonPublic); -#endif } object CreateInstance (Type type) @@ -817,14 +803,10 @@ namespace System.Xml.Serialization object ReadXmlNode (TypeData type, bool wrapped) { -#if MOONLIGHT - throw new NotSupportedException (); -#else if (type.Type == typeof (XmlDocument)) return ReadXmlDocument (wrapped); else return ReadXmlNode (wrapped); -#endif } object ReadPrimitiveElement (XmlTypeMapping typeMap, bool isNullable) @@ -857,7 +839,7 @@ namespace System.Xml.Serialization Reader.MoveToContent (); if (Reader.NodeType == XmlNodeType.Element) { - if (Reader.LocalName == typeMap.ElementName && Reader.NamespaceURI == typeMap.Namespace) + if (typeMap.IsAny || (Reader.LocalName == typeMap.ElementName && Reader.NamespaceURI == typeMap.Namespace)) { object ob = CreateInstance (typeMap.TypeData.Type, true); return ReadSerializable ((IXmlSerializable)ob);