X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Runtime.Serialization%2FSystem.Runtime.Serialization%2FXmlFormatterDeserializer.cs;h=52e5bc7bd07965c8d36f45720d84569b9d5716c9;hb=5ad1099341581dee94f77b32db728918e90fa64f;hp=88dcd1c063c8cfff7686950f101aa40ca136efc4;hpb=bf1d286b72d9ffb15f926d40fd9e0b6b5fcf1c39;p=mono.git diff --git a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs index 88dcd1c063c..52e5bc7bd07 100644 --- a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs +++ b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs @@ -104,19 +104,16 @@ namespace System.Runtime.Serialization get { return references; } } -#if !MOONLIGHT XmlDocument document; XmlDocument XmlDocument { get { return (document = document ?? new XmlDocument ()); } } -#endif // This method handles z:Ref, xsi:nil and primitive types, and then delegates to DeserializeByMap() for anything else. public object Deserialize (Type type, XmlReader reader) { -#if !MOONLIGHT if (type == typeof (XmlElement)) return XmlDocument.ReadNode (reader); else if (type == typeof (XmlNode [])) { @@ -127,7 +124,6 @@ namespace System.Runtime.Serialization reader.ReadEndElement (); return l.ToArray (); } -#endif QName graph_qname = null; if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof (Nullable<>)) { @@ -200,8 +196,14 @@ namespace System.Runtime.Serialization object DeserializePrimitive (Type type, XmlReader reader, QName qname) { + bool isDateTimeOffset = false; + // Handle DateTimeOffset type and DateTimeOffset?. + if (type == typeof (DateTimeOffset)) + isDateTimeOffset = true; + else if(type.IsGenericType && type.GetGenericTypeDefinition () == typeof (Nullable<>)) + isDateTimeOffset = type.GetGenericArguments () [0] == typeof (DateTimeOffset); // It is the only exceptional type that does not serialize to string but serializes into complex element. - if (type == typeof (DateTimeOffset)) { + if (isDateTimeOffset) { if (reader.IsEmptyElement) { reader.Read (); return default (DateTimeOffset); @@ -231,7 +233,12 @@ namespace System.Runtime.Serialization object DeserializeByMap (QName name, Type type, XmlReader reader) { - SerializationMap map = resolved_qnames.ContainsKey (name) ? types.FindUserMap (type) : types.FindUserMap (name); // use type when the name is "resolved" one. Otherwise use name (there are cases that type cannot be resolved by type). + SerializationMap map = null; + // List and T[] have the same QName, use type to find map work better. + if(name.Name.StartsWith ("ArrayOf", StringComparison.Ordinal) || resolved_qnames.ContainsKey (name)) + map = types.FindUserMap (type); + else + map = types.FindUserMap (name); // use type when the name is "resolved" one. Otherwise use name (there are cases that type cannot be resolved by type). if (map == null && (name.Name.StartsWith ("ArrayOf", StringComparison.Ordinal) || name.Namespace == KnownTypeCollection.MSArraysNamespace || name.Namespace.StartsWith (KnownTypeCollection.DefaultClrNamespaceBase, StringComparison.Ordinal))) { @@ -254,7 +261,7 @@ namespace System.Runtime.Serialization if (name.StartsWith ("ArrayOf", StringComparison.Ordinal)) { name = name.Substring (7); // strip "ArrayOf" if (ns == KnownTypeCollection.MSArraysNamespace) - return GetTypeFromNamePair (name, String.Empty).MakeArrayType (); + return GetTypeFromNamePair (name, KnownTypeCollection.MSSimpleNamespace).MakeArrayType (); makeArray = true; } @@ -264,15 +271,7 @@ namespace System.Runtime.Serialization foreach (var ass in AppDomain.CurrentDomain.GetAssemblies ()) { Type [] types; -#if MOONLIGHT - try { - types = ass.GetTypes (); - } catch (System.Reflection.ReflectionTypeLoadException rtle) { - types = rtle.Types; - } -#else types = ass.GetTypes (); -#endif if (types == null) continue;