2010-05-19 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Wed, 19 May 2010 07:58:59 +0000 (07:58 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Wed, 19 May 2010 07:58:59 +0000 (07:58 -0000)
* XmlFormatterDeserializer.cs : Array of something with non-default
  namespace should be deserialized as well. Required for fixing
  PeerResolvers ResolveResponseInfo serialization test case.

svn path=/trunk/mcs/; revision=157531

mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/ChangeLog
mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs

index 385325f9d0aba11808c41697215e00a38f9e2d5a..bb9c0f30c2c8e40cb56e80319a4368d1559497bd 100755 (executable)
@@ -1,3 +1,9 @@
+2010-05-19  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XmlFormatterDeserializer.cs : Array of something with non-default
+         namespace should be deserialized as well. Required for fixing
+         PeerResolvers ResolveResponseInfo serialization test case.
+
 2010-05-19  Andreia Gaita  <avidigal@novell.com>
 
        * SerializationMap.cs: when deserializing, it is possible that the
index 1659a2463ed871d090a5012a87dfd74f5169ac3f..c6627922227a5ced4ae8953b60072acdb48805cd 100644 (file)
@@ -165,7 +165,8 @@ namespace System.Runtime.Serialization
                object DeserializeByMap (QName name, Type type, XmlReader reader)
                {
                        SerializationMap map = types.FindUserMap (name);
-                       if (map == null && (name.Namespace == KnownTypeCollection.MSArraysNamespace ||
+                       if (map == null && (name.Name.StartsWith ("ArrayOf", StringComparison.Ordinal) ||
+                           name.Namespace == KnownTypeCollection.MSArraysNamespace ||
                            name.Namespace.StartsWith (KnownTypeCollection.DefaultClrNamespaceBase, StringComparison.Ordinal))) {
                                var it = GetTypeFromNamePair (name.Name, name.Namespace);
                                types.TryRegister (it);
@@ -182,19 +183,24 @@ namespace System.Runtime.Serialization
                        Type p = KnownTypeCollection.GetPrimitiveTypeFromName (name); // FIXME: namespace?
                        if (p != null)
                                return p;
-                       if (name.StartsWith ("ArrayOf", StringComparison.Ordinal) && ns == KnownTypeCollection.MSArraysNamespace)
-                               return GetTypeFromNamePair (name.Substring (7), String.Empty).MakeArrayType ();
+                       bool makeArray = false;
+                       if (name.StartsWith ("ArrayOf", StringComparison.Ordinal)) {
+                               name = name.Substring (7); // strip "ArrayOf"
+                               if (ns == KnownTypeCollection.MSArraysNamespace)
+                                       return GetTypeFromNamePair (name, String.Empty).MakeArrayType ();
+                               makeArray = true;
+                       }
 
-                       int xlen = KnownTypeCollection.DefaultClrNamespaceBase.Length;
-                       string clrns = ns.Length > xlen ?  ns.Substring (xlen) : null;
+                       string dnsb = KnownTypeCollection.DefaultClrNamespaceBase;
+                       string clrns = ns.StartsWith (dnsb, StringComparison.Ordinal) ?  ns.Substring (dnsb.Length) : ns;
 
                        foreach (var ass in AppDomain.CurrentDomain.GetAssemblies ()) {
                                foreach (var t in ass.GetTypes ()) {
                                        var dca = t.GetCustomAttribute<DataContractAttribute> (true);
                                        if (dca != null && dca.Name == name && dca.Namespace == ns)
-                                               return t;
+                                               return makeArray ? t.MakeArrayType () : t;
                                        if (clrns != null && t.Name == name && t.Namespace == clrns)
-                                               return t;
+                                               return makeArray ? t.MakeArrayType () : t;
                                }
                        }
                        throw new XmlException (String.Format ("Type not found; name: {0}, namespace: {1}", name, ns));