using Qimen.Api; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.IO; 
 | 
using System.Text; 
 | 
using System.Threading; 
 | 
using System.Xml.Serialization; 
 | 
using Top.Api; 
 | 
using Top.Api.Parser; 
 | 
  
 | 
namespace QimenCloud.Api.Parser 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// 奇门XML响应通用解释器。 
 | 
    /// </summary> 
 | 
    /// <typeparam name="T"></typeparam> 
 | 
    public class QimenXmlParser<T> : ITopParser<T> where T : QimenResponse 
 | 
    { 
 | 
        private static readonly ReaderWriterLock rwLock = new ReaderWriterLock(); 
 | 
        private static readonly Dictionary<string, XmlSerializer> parsers = new Dictionary<string, XmlSerializer>(); 
 | 
  
 | 
        public T Parse(string body) 
 | 
        { 
 | 
            Type type = typeof(T); 
 | 
            return Parse(body, type); 
 | 
        } 
 | 
  
 | 
        public T Parse(string body, Type type) 
 | 
        { 
 | 
            string key = type.FullName; 
 | 
  
 | 
            XmlSerializer serializer = null; 
 | 
            bool incl = false; 
 | 
  
 | 
            rwLock.AcquireReaderLock(50); 
 | 
            try 
 | 
            { 
 | 
                if (rwLock.IsReaderLockHeld) 
 | 
                { 
 | 
                    incl = parsers.TryGetValue(key, out serializer); 
 | 
                } 
 | 
            } 
 | 
            finally 
 | 
            { 
 | 
                if (rwLock.IsReaderLockHeld) 
 | 
                { 
 | 
                    rwLock.ReleaseReaderLock(); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            if (!incl || serializer == null) 
 | 
            { 
 | 
                XmlAttributes rootAttrs = new XmlAttributes(); 
 | 
                rootAttrs.XmlRoot = new XmlRootAttribute(Constants.QM_ROOT_TAG_RSP); 
 | 
  
 | 
                XmlAttributeOverrides attrOvrs = new XmlAttributeOverrides(); 
 | 
                attrOvrs.Add(type, rootAttrs); 
 | 
  
 | 
                serializer = new XmlSerializer(type, attrOvrs); 
 | 
  
 | 
                rwLock.AcquireWriterLock(50); 
 | 
                try 
 | 
                { 
 | 
                    if (rwLock.IsWriterLockHeld) 
 | 
                    { 
 | 
                        parsers[key] = serializer; 
 | 
                    } 
 | 
                } 
 | 
                finally 
 | 
                { 
 | 
                    if (rwLock.IsWriterLockHeld) 
 | 
                    { 
 | 
                        rwLock.ReleaseWriterLock(); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
  
 | 
            object obj = null; 
 | 
            using (System.IO.Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(body))) 
 | 
            { 
 | 
                obj = serializer.Deserialize(stream); 
 | 
            } 
 | 
  
 | 
            T rsp = (T)obj; 
 | 
            if (rsp != null) 
 | 
            { 
 | 
                rsp.Body = body; 
 | 
            } 
 | 
            return rsp; 
 | 
        } 
 | 
    } 
 | 
} 
 |