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); }
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(); } }
/// <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(); } }
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)); } }