2009-05-18 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Mon, 18 May 2009 10:05:16 +0000 (10:05 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Mon, 18 May 2009 10:05:16 +0000 (10:05 -0000)
* SerializationMap.cs, XmlFormatterDeserializer.cs,
  KnownTypeCollection.cs : Support for array of some primitive types
  in the deserializer was missing, which resulted in peer resolver
  RegisterInfo deserialization failure.

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

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

index ffd081a4add02c679d52e31efb8b59c3b509a730..8d759ce83ce3afe515d224946ae1262bb3694ed5 100755 (executable)
@@ -1,3 +1,10 @@
+2009-05-18  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * SerializationMap.cs, XmlFormatterDeserializer.cs,
+         KnownTypeCollection.cs : Support for array of some primitive types
+         in the deserializer was missing, which resulted in peer resolver
+         RegisterInfo deserialization failure.
+
 2009-05-18  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XmlFormatterDeserializer.cs : remove type lookup optimization
index bec30c72724d2bd3450a1c8a747c5bc2e5e33f7e..fb704544173d44c2d8b0239c843b63e2bd3b2c5e 100644 (file)
@@ -266,34 +266,53 @@ namespace System.Runtime.Serialization
                        }
                }
 
-               internal static bool IsPrimitiveType (QName qname)
+               internal static Type GetPrimitiveTypeFromName (string name)
                {
-                       /* FIXME: qname.Namespace ? */
-                       switch (qname.Name) {
+                       switch (name) {
                        case "anyURI":
+                               return typeof (Uri);
                        case "boolean":
+                               return typeof (bool);
                        case "base64Binary":
+                               return typeof (byte []);
                        case "dateTime":
+                               return typeof (DateTime);
                        case "duration":
+                               return typeof (TimeSpan);
                        case "QName":
+                               return typeof (QName);
                        case "decimal":
+                               return typeof (decimal);
                        case "double":
+                               return typeof (double);
                        case "float":
+                               return typeof (float);
                        case "byte":
+                               return typeof (sbyte);
                        case "short":
+                               return typeof (short);
                        case "int":
+                               return typeof (int);
                        case "long":
+                               return typeof (long);
                        case "unsignedByte":
+                               return typeof (byte);
                        case "unsignedShort":
+                               return typeof (ushort);
                        case "unsignedInt":
+                               return typeof (uint);
                        case "unsignedLong":
+                               return typeof (ulong);
                        case "string":
+                               return typeof (string);
                        case "anyType":
+                               return typeof (object);
                        case "guid":
+                               return typeof (Guid);
                        case "char":
-                               return true;
+                               return typeof (char);
                        default:
-                               return false;
+                               return null;
                        }
                }
 
index 8397dd67829f074041317ebc0b6575836b4f4349..ce1638ea5c6dfedd2cf2095bdff97fb1e31e1027 100644 (file)
@@ -408,7 +408,7 @@ namespace System.Runtime.Serialization
                        KnownTypes.Add (type);
                        QName qname = KnownTypes.GetQName (type);
                        string rootNamespace = KnownTypes.GetQName (mi.DeclaringType).Namespace;
-                       if (KnownTypeCollection.IsPrimitiveType (qname))
+                       if (KnownTypeCollection.GetPrimitiveTypeFromName (qname.Name) != null)
                                return new DataMemberInfo (mi, dma, rootNamespace, null);
                        else
                                return new DataMemberInfo (mi, dma, rootNamespace, qname.Namespace);
index ac0a678241b01977810322148f97e18cb8e369ef..8e45553c7b54a184ad1a12384ae240fcc96bed97 100644 (file)
@@ -155,7 +155,7 @@ namespace System.Runtime.Serialization
 
                object DeserializeContent (QName name, Type type, XmlReader reader, bool isEmpty)
                {
-                       if (KnownTypeCollection.IsPrimitiveType (name)) {
+                       if (KnownTypeCollection.GetPrimitiveTypeFromName (name.Name) != null) {
                                string value;
                                if (isEmpty) {
                                        if (type.IsValueType)
@@ -170,10 +170,11 @@ namespace System.Runtime.Serialization
                        }
 
                        SerializationMap map = types.FindUserMap (name);
-                       if (map == null && name.Namespace.StartsWith (KnownTypeCollection.DefaultClrNamespaceBase, StringComparison.Ordinal)) {
+                       if (map == null && (name.Namespace == KnownTypeCollection.MSArraysNamespace ||
+                           name.Namespace.StartsWith (KnownTypeCollection.DefaultClrNamespaceBase, StringComparison.Ordinal))) {
                                var it = GetTypeFromNamePair (name.Name, name.Namespace);
-                               if (types.TryRegister (it))
-                                       map = types.FindUserMap (name);
+                               types.TryRegister (it);
+                               map = types.FindUserMap (name);
                        }
                        if (map == null)
                                throw new SerializationException (String.Format ("Unknown type {0} is used for DataContract with reference of name {1}. Any derived types of a data contract or a data member should be added to KnownTypes.", type, name));
@@ -186,6 +187,12 @@ namespace System.Runtime.Serialization
 
                Type GetTypeFromNamePair (string name, string ns)
                {
+                       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 ();
+
                        int xlen = KnownTypeCollection.DefaultClrNamespaceBase.Length;
                        string clrns = ns.Length > xlen ?  ns.Substring (xlen) : null;