2011-11-16 29 views
5

kodXML serileştirme işlemi nasıl daha hızlı yapılır?

public static object XmlDeserialize(string xml, Type objType) 
{ 
    StringReader stream = null; 
    XmlTextReader reader = null; 
    try 
    { 
     XmlSerializer serializer = new XmlSerializer(objType); 
     stream = new StringReader(xml); // Read xml data 
     reader = new XmlTextReader(stream); // Create reader 
     return serializer.Deserialize(reader); 
    } 
    finally 
    { 
     if(stream != null) stream.Close(); 
     if(reader != null) reader.Close(); 
    } 
} 

nesnenin kendisi aşağıdaki parça xsd.exe ile oluşturulur ve bu şekilde bir tür görünüyor edilmiş adres:

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class MyObject { 

    private DemographicsCriteriaStateStartAge[] startAgesField; 

    private DemographicsCriteriaStateEndAge[] endAgesField; 

    private DemographicsCriteriaStateFilter[] selectedFiltersField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlArrayItemAttribute("StartAge", IsNullable=false)] 
    public DemographicsCriteriaStateStartAge[] StartAges { 
     get { 
      return this.startAgesField; 
     } 
     set { 
      this.startAgesField = value; 
     } 
    } 
    ... 

yöntem tipik olarak aşağıdaki gibi adlandırılır:

var obj = (MyObject) XmlDeserialize(someXmlString, typeof(MyObject)); 

Aşağıdaki kod satırı her zaman oldukça büyük bir zaman dilimi alır (her şeyle karşılaştırıldığında):

Burada neler oluyor örn. arka planda bir seri hale getirme derlemesi mi derliyor? Neden performans sorunu?

Bu performans sorununu gidermek için ne yapabilirim?

+0

Bir yan not, yerine 'deneyin … Nihayet, '' 'seçeneğini kullanmış olabilirdin. – svick

cevap

5

Evet, dinamik olarak çalışma zamanında bir seri hale getirme derlemesi oluşturuyor. Visual Studio'da bu davranışı değiştirebilirsiniz. Proje özelliklerine ve yapı bölümüne gidin. "Seri hale getirme derlemeleri oluştur" ayarını true olarak ayarla. Bu, derleme yaptığınızda bu tıkanıklığı durduracak ve YourProject.XmlSerialiser.dll gibi bir dosya oluşturacaktır. Bununla birlikte, dikkat edilmesi gereken bir nokta, bu ayarın yalnızca proxy türleri için geçerli olması (örneğin, web hizmeti proxy'leri ve benzerleri) olmasıdır. Düzenli türler için seri hale getirme derlemeleri oluşturmak için Visual Studio 2010'u zorlamak için, ya proje dosyasıyla (.csproj) karıştırılmalı ve Sgen çağrısından/proxytypes kaldırılmalı ya da derleme sırasında el ile sgen.exe'yi çağırmak için bir oluşturma sonrası adımı oluşturulmalıdır. Eğer bunu aynı tip kullanılırsa her zaman yeniden oluşturmak zorunda kalmamak

+0

Bir sürü derlemem var. Ana EXE veya bağımlı DLL derlemeleri için ayarlarımı ayarlı mıyım? Btw, ben tüm bunları yaptım ve bin/debug herhangi bir YourProject.XmlSerialiser.dll dosyaları görmedim. – AngryHacker

+0

Sadece web proxy'leriyle kullanıyorum ve burada bir hata olup olmadığı konusunda bir tartışma var gibi görünüyor. Http://connect.microsoft.com/VisualStudio/feedback/details/123088/project-does-not-generate- seri montaj bile-zaman-spesifik-anlattı-to-do-so. Daha ince taneli kontrol için http://msdn.microsoft.com/en-us/library/bk3w6240(v=vs.80).aspx –

+0

belgelenen exe aracına bakın. Normal derleme başına bir serileştirme düzeneğine ihtiyacınız olacağını düşünüyorum . –

4

sınıf düzeyinde her türü için XmlSerializer örneğini önbelleğe deneyin:

class Foo 
{ 
    private static Dictionary<Type, XmlSerializer> xmls = new Dictionary<Type, XmlSerializer>(); 

    // ... 

    public static object XmlDeserialize(string xml, Type objType) 
    { 
     StringReader stream = null; 
     XmlTextReader reader = null; 
     try 
     { 
      XmlSerializer serializer; 
      if(xmls.Contains(objType)) { 
       serializer = xmls[objType]; 
      } 
      else { 
       serializer = new XmlSerializer(objType); 
       xmls[objType] = serializer; 
      }   

      stream = new StringReader(xml); // Read xml data 
      reader = new XmlTextReader(stream); // Create reader 
      return serializer.Deserialize(reader); 
     } 
     finally 
     { 
      if(stream != null) stream.Close(); 
      if(reader != null) reader.Close(); 
     } 
    } 
} 
+0

Bu, basit bir sınıf için bile bir XmlSerializer oluşturmanın ne kadar sürdüğünü öğrendiğimde yanıtımdı. Ancak, önbelleklemenin XmlSerializer sınıfında gerçekleştiğini düşünüyorum, çünkü belirli bir tür için bir XmlSerializer oluşturduğunuzda, neredeyse uzun sürmez. – markmuetz

İlgili konular