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