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