コード例 #1
0
 public override object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib)
 {
     if (null == xmlAttrib)
     {
         string typeName = xmlReader.GetAttribute(Keywords.MSD_INSTANCETYPE, Keywords.MSDNS);
         if (typeName == null)
         {
             string xsdTypeName = xmlReader.GetAttribute(Keywords.MSD_INSTANCETYPE, Keywords.XSINS); // this xsd type
             if (null != xsdTypeName)
             {
                 typeName = XSDSchema.XsdtoClr(xsdTypeName).FullName;
             }
         }
         Type   type = (typeName == null) ? _dataType : Type.GetType(typeName);
         object Obj  = System.Activator.CreateInstance(type, true);
         Debug.Assert(xmlReader is DataTextReader, "Invalid DataTextReader is being passed to customer");
         ((IXmlSerializable)Obj).ReadXml(xmlReader);
         return(Obj);
     }
     else
     {
         XmlSerializer deserializerWithRootAttribute = ObjectStorage.GetXmlSerializer(_dataType, xmlAttrib);
         return(deserializerWithRootAttribute.Deserialize(xmlReader));
     }
 }
コード例 #2
0
        public override object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib)
        {
            if (xmlAttrib != null)
            {
                return(ObjectStorage.GetXmlSerializer(base.DataType, xmlAttrib).Deserialize(xmlReader));
            }
            string attribute = xmlReader.GetAttribute("InstanceType", "urn:schemas-microsoft-com:xml-msdata");

            if (attribute == null)
            {
                string xsdTypeName = xmlReader.GetAttribute("InstanceType", "http://www.w3.org/2001/XMLSchema-instance");
                if (xsdTypeName != null)
                {
                    attribute = XSDSchema.XsdtoClr(xsdTypeName).FullName;
                }
            }
            Type   type = (attribute == null) ? base.DataType : Type.GetType(attribute);
            object obj2 = Activator.CreateInstance(type, true);

            ((IXmlSerializable)obj2).ReadXml(xmlReader);
            return(obj2);
        }
コード例 #3
0
        public override object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib)
        {
            object?retValue      = null;
            bool   isBaseCLRType = false;
            bool   legacyUDT     = false; // in 1.0 and 1.1 we used to call ToString on CDT obj. so if we have the same case

            // we need to handle the case when we have column type as object.
            if (null == xmlAttrib)
            { // this means type implements IXmlSerializable
                Type?  type     = null;
                string?typeName = xmlReader.GetAttribute(Keywords.MSD_INSTANCETYPE, Keywords.MSDNS);
                if (typeName == null || typeName.Length == 0)
                {                                                                               // No CDT polumorphism
                    string?xsdTypeName = xmlReader.GetAttribute(Keywords.TYPE, Keywords.XSINS); // this xsd type: Base type polymorphism
                    if (null != xsdTypeName && xsdTypeName.Length > 0)
                    {
                        string[] _typename = xsdTypeName.Split(':');
                        if (_typename.Length == 2)
                        { // split will return aray of size 1 if ":" is not there
                            if (xmlReader.LookupNamespace(_typename[0]) == Keywords.XSDNS)
                            {
                                xsdTypeName = _typename[1]; // trim the prefix and just continue with
                            }
                        } // for other case, let say we have two ':' in type, the we throws (as old behavior)
                        type          = XSDSchema.XsdtoClr(xsdTypeName);
                        isBaseCLRType = true;
                    }
                    else if (_dataType == typeof(object))
                    {                     // there is no Keywords.MSD_INSTANCETYPE and no Keywords.TYPE
                        legacyUDT = true; // see if our type is object
                    }
                }

                if (legacyUDT)
                { // if Everett UDT, just read it and return string
                    retValue = xmlReader.ReadString();
                }
                else
                {
                    if (typeName == Keywords.TYPEINSTANCE)
                    {
                        retValue = Type.GetType(xmlReader.ReadString());
                        xmlReader.Read(); // need to move to next node
                    }
                    else
                    {
                        if (null == type)
                        {
                            type = (typeName == null) ? _dataType : DataStorage.GetType(typeName);
                        }

                        if (type == typeof(char) || type == typeof(Guid))
                        { //msdata:char and msdata:guid imply base types.
                            isBaseCLRType = true;
                        }

                        if (type == typeof(object))
                        {
                            throw ExceptionBuilder.CanNotDeserializeObjectType();
                        }

                        TypeLimiter.EnsureTypeIsAllowed(type);

                        if (!isBaseCLRType)
                        {
                            retValue = System.Activator.CreateInstance(type, true) !;
                            Debug.Assert(xmlReader is DataTextReader, "Invalid DataTextReader is being passed to customer");
                            ((IXmlSerializable)retValue).ReadXml(xmlReader);
                        }
                        else
                        {  // Process Base CLR type
                           // for Element Node, if it is Empty, ReadString does not move to End Element; we need to move it
                            if (type == typeof(string) && xmlReader.NodeType == XmlNodeType.Element && xmlReader.IsEmptyElement)
                            {
                                retValue = string.Empty;
                            }
                            else
                            {
                                retValue = xmlReader.ReadString();
                                if (type != typeof(byte[]))
                                {
                                    retValue = SqlConvert.ChangeTypeForXML(retValue, type);
                                }
                                else
                                {
                                    retValue = Convert.FromBase64String(retValue.ToString() !);
                                }
                            }
                            xmlReader.Read();
                        }
                    }
                }
            }
            else
            {
                XmlSerializer deserializerWithRootAttribute = ObjectStorage.GetXmlSerializer(_dataType, xmlAttrib);
                retValue = deserializerWithRootAttribute.Deserialize(xmlReader);
            }
            return(retValue !);
        }
コード例 #4
0
        public override object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib)
        {
            object obj2  = null;
            bool   flag  = false;
            bool   flag2 = false;

            if (xmlAttrib != null)
            {
                return(GetXmlSerializer(base.DataType, xmlAttrib).Deserialize(xmlReader));
            }
            Type   type      = null;
            string attribute = xmlReader.GetAttribute("InstanceType", "urn:schemas-microsoft-com:xml-msdata");

            if ((attribute == null) || (attribute.Length == 0))
            {
                string xsdTypeName = xmlReader.GetAttribute("type", "http://www.w3.org/2001/XMLSchema-instance");
                if ((xsdTypeName != null) && (xsdTypeName.Length > 0))
                {
                    string[] strArray = xsdTypeName.Split(new char[] { ':' });
                    if ((strArray.Length == 2) && (xmlReader.LookupNamespace(strArray[0]) == "http://www.w3.org/2001/XMLSchema"))
                    {
                        xsdTypeName = strArray[1];
                    }
                    type = XSDSchema.XsdtoClr(xsdTypeName);
                    flag = true;
                }
                else if (base.DataType == typeof(object))
                {
                    flag2 = true;
                }
            }
            if (flag2)
            {
                return(xmlReader.ReadString());
            }
            if (attribute == "Type")
            {
                obj2 = Type.GetType(xmlReader.ReadString());
                xmlReader.Read();
                return(obj2);
            }
            if (null == type)
            {
                type = (attribute == null) ? base.DataType : DataStorage.GetType(attribute);
            }
            if ((type == typeof(char)) || (type == typeof(Guid)))
            {
                flag = true;
            }
            if (type == typeof(object))
            {
                throw ExceptionBuilder.CanNotDeserializeObjectType();
            }
            if (!flag)
            {
                obj2 = Activator.CreateInstance(type, true);
                ((IXmlSerializable)obj2).ReadXml(xmlReader);
                return(obj2);
            }
            if (((type == typeof(string)) && (xmlReader.NodeType == XmlNodeType.Element)) && xmlReader.IsEmptyElement)
            {
                obj2 = string.Empty;
            }
            else
            {
                obj2 = xmlReader.ReadString();
                if (type != typeof(byte[]))
                {
                    obj2 = SqlConvert.ChangeTypeForXML(obj2, type);
                }
                else
                {
                    obj2 = Convert.FromBase64String(obj2.ToString());
                }
            }
            xmlReader.Read();
            return(obj2);
        }