2011-09-29 13 views
7

मैं सी # में prefetch करना चाहते हैं, वर्ग प्रकार की एक में जाना जाता है सेट के XmlTypeMapping उनमें से एक्सएमएल अक्रमांकन तेजी लाने के लिए, जबकि instantiating एक नया XmlSerializerXmlReflectionImporter.ImportTypeMapping के रूप में (एक वर्ग पर XmlSerializer contruction दौरान हो रहा प्रकार) काफी समय ले रहा है और प्रत्येक XmlSerializer निर्माण पर ऐसा प्रतीत होता है।XmlSerializer निर्माता

इसके अतिरिक्त xml सामग्री मैं पार्सिंग कर रहा हूं मुझे XmlRootAttribute तर्क का उपयोग करने के लिए xml रूट तत्व नाम को पार्स करने के लिए तर्क देता है क्योंकि यह हमेशा समान नहीं होता है। इसे प्राप्त करने के लिए, मैं अपने ऑब्जेक्ट को deserialize करने के लिए XmlSerializer(Type, XmlRootAttribute) कन्स्ट्रक्टर का उपयोग कर सकते हैं।

हालांकि मैं प्रीफ़ेच XmlTypeMapping से लाभ भी लेना चाहता हूं और मुझे XmlSerializer कन्स्ट्रक्टर जैसे XmlSerializer(XmlTypeMapping, XmlRootAttribute) या कुछ नज़दीक नहीं दिख रहा है। मैं इसे कैसे प्राप्त कर सकता हूं?

किसी भी मदद की सराहना की जाएगी! धन्यवाद।

+1

उस कन्स्ट्रक्टर का एक और नुकसान यह है कि यह स्मृति में रनटाइम से उत्पन्न deserializer असेंबली रखेगा जिसे – Aphelion

उत्तर

3

अंतर्निहित कैश का उपयोग किसी भी रचनाकार पर नहीं किया जाता है जो XmlRootAttribute स्वीकार करता है। आपका सबसे अच्छा शर्त निर्माता है कि एक ही XmlTypeMapping पैरामीटर स्वीकार करता है उपयोग करने के लिए है:

public XmlSerializer(XmlTypeMapping xmlTypeMapping) 

और अपने स्वयं के निर्माता है कि एक XmlRootAttribute स्वीकार करता है में लपेट के लिए, और इसे से XmlTypeMapping निर्माण करती XmlReflectionImporter का उपयोग कर:

public class CachedRootXmlSerializer : XmlSerializer 
{ 
    private static Dictionary<int, XmlTypeMapping> rootMapCache = new Dictionary<int,XmlTypeMapping>(); 

    private static XmlTypeMapping GetXmlTypeMappingFromRoot(Type type, XmlRootAttribute xmlRootAttribute) 
    { 
     XmlTypeMapping result = null; 
     int hash = 17; 

     unchecked 
     { 
      hash = hash * 31 + type.GUID.GetHashCode(); 
      hash = hash * 31 + xmlRootAttribute.GetHashCode(); 
     } 

     lock (rootMapCache) 
     { 
      if (!rootMapCache.ContainsKey(hash)) 
      { 
       XmlReflectionImporter importer = new XmlReflectionImporter(null, null); 
       rootMapCache[hash] = importer.ImportTypeMapping(type, xmlRootAttribute, null); 
      } 
      result = rootMapCache[hash]; 
     } 

     return result; 
    } 

    CachedRootXmlSerializer(Type type, XmlRootAttribute xmlRootAttribute) 
     : base(GetXmlTypeMappingFromRoot(type, xmlRootAttribute)) 
    { 
    } 
} 

आनंद लें!

+1

जारी नहीं किया जा सकता है धन्यवाद, यह वास्तव में स्मार्ट है। :) – dletozeun