コード例 #1
0
        private object DeserializeArrayXmlSerializer(System.Xml.XmlDictionaryReader xmlReader, Type parameterType, string parameterName, string parameterNs, ICustomAttributeProvider customAttributeProvider)
        {
            var xmlArrayAttributes = customAttributeProvider.GetCustomAttributes(typeof(XmlArrayItemAttribute), true);
            XmlArrayItemAttribute xmlArrayItemAttribute = xmlArrayAttributes.FirstOrDefault() as XmlArrayItemAttribute;
            var xmlElementAttributes = customAttributeProvider.GetCustomAttributes(typeof(XmlElementAttribute), true);
            XmlElementAttribute xmlElementAttribute = xmlElementAttributes.FirstOrDefault() as XmlElementAttribute;

            var isEmpty             = xmlReader.IsEmptyElement;
            var hasContainerElement = xmlElementAttribute == null;

            if (hasContainerElement)
            {
                xmlReader.ReadStartElement(parameterName, parameterNs);
            }

            var elementType = parameterType.GetElementType();

            var arrayItemName = xmlArrayItemAttribute?.ElementName ?? xmlElementAttribute?.ElementName ?? elementType.Name;

            if (xmlArrayItemAttribute?.ElementName == null && elementType.Namespace?.StartsWith("System") == true)
            {
                var compiler = new CSharpCodeProvider();
                var type     = new CodeTypeReference(elementType);
                arrayItemName = compiler.GetTypeOutput(type);
            }

            var deserializeMethod  = typeof(XmlSerializerExtensions).GetGenericMethod(nameof(XmlSerializerExtensions.DeserializeArray), elementType);
            var arrayItemNamespace = xmlArrayItemAttribute?.Namespace ?? parameterNs;

            var serializer = CachedXmlSerializer.GetXmlSerializer(elementType, arrayItemName, arrayItemNamespace);

            object result = null;

            lock (serializer)
            {
                if (xmlReader.HasValue && elementType?.FullName == "System.Byte")
                {
                    result = xmlReader.ReadContentAsBase64();
                }
                else
                {
                    result = deserializeMethod.Invoke(null, new object[] { serializer, arrayItemName, arrayItemNamespace, xmlReader });
                }
            }

            if (!isEmpty && hasContainerElement)
            {
                xmlReader.ReadEndElement();
            }

            return(result);
        }
コード例 #2
0
 public override object ReadObject(System.Xml.XmlDictionaryReader reader, bool verifyObjectName)
 {
     if (reader.GetAttribute("nil") == "true")
     {
         return(null);
     }
     reader.ReadStartElement(PROTO_ELEMENT);
     try
     {
         using (MemoryStream ms = new MemoryStream(reader.ReadContentAsBase64()))
         {
             T val = Serializer.Deserialize <T>(ms);
             return(val);
         }
     }
     finally
     {
         reader.ReadEndElement();
     }
 }
コード例 #3
0
 /// <summary>
 /// Reads the body of an object
 /// </summary>
 public override object ReadObject(System.Xml.XmlDictionaryReader reader, bool verifyObjectName)
 {
     if (reader.GetAttribute("nil") == "true")
     {
         return(null);
     }
     reader.ReadStartElement(PROTO_ELEMENT);
     try
     {
         using (MemoryStream ms = new MemoryStream(reader.ReadContentAsBase64()))
         {
             using (ProtoReader protoReader = new ProtoReader(ms, model, null))
             {
                 return(model.Deserialize(key, null, protoReader));
             }
         }
     }
     finally
     {
         reader.ReadEndElement();
     }
 }
コード例 #4
0
        private static object DeserializeObject(System.Xml.XmlDictionaryReader xmlReader, Type parameterType, string parameterName, string parameterNs)
        {
            // see https://referencesource.microsoft.com/System.Xml/System/Xml/Serialization/XmlSerializer.cs.html#c97688a6c07294d5
            var elementType = parameterType.GetElementType();

            if (elementType == null || parameterType.IsArray)
            {
                elementType = parameterType;
            }

            var serializer = CachedXmlSerializer.GetXmlSerializer(elementType, parameterName, parameterNs);

            lock (serializer)
            {
                if (elementType == typeof(Stream) || typeof(Stream).IsAssignableFrom(elementType))
                {
                    xmlReader.Read();
                    return(new MemoryStream(xmlReader.ReadContentAsBase64()));
                }

                return(serializer.Deserialize(xmlReader));
            }
        }