2008-12-16 30 views
12

.NET Serileştirme'yi kullanarak Method adlı bir sınıfı seri hale getiriyorum. Method, IAction'u uygulayan nesnelerin bir listesini içerir. İlk olarak IAction'u uygulayan tüm sınıfları belirtmek için [XmlInclude] özniteliğini kullandım.XmlInclude olmadan serileştirme

Ama şimdi, bir dizinde tüm dll'leri yüklemek ve IAction'u uygulayan sınıfları çıkarmak için programımı değiştirmek istiyorum. Daha sonra kullanıcılar, IAction'u uygulayan eylemlerini içeren dosyaları kaldırabilirler.

Artık IAction uygulayan sınıfları denetlemiyorum, bu nedenle [XmlInclude] kullanamıyorum.

Bu özniteliği çalışma zamanında ayarlamanın bir yolu var mı? Veya uygulama sınıfı için benzer bir özellik var mı?

public XmlSerializer(
    Type type, 
    Type[] extraTypes 
); 

İkinci argüman olarak assemblyTypes sizin dizisi geçirmek gerekir:

public class Method 
{ 
    public List<Actions.IAction> Actions = new List<Actions.IAction>(); 
} 

public interface IAction 
{ 
    void DoExecute(); 
} 

public static Type[] LoadActionPlugins(string pluginDirectoryPath) 
{ 
    List<Type> pluginTypes = new List<Type>(); 

    string[] filesInDirectory = Directory.GetFiles(pluginDirectoryPath, "*.dll", SearchOption.TopDirectoryOnly); 
    foreach (string pluginPath in filesInDirectory) 
    { 
     System.Reflection.Assembly actionPlugin = System.Reflection.Assembly.LoadFrom(pluginPath); 
     Type[] assemblyTypes = actionPlugin.GetTypes(); 
     foreach (Type type in assemblyTypes) 
     { 
      Type foundInterface = type.GetInterface("IAction"); 
      if (foundInterface != null) 
      { 
       pluginTypes.Add(type); 
      } 
     } 
    } 

    return pluginTypes.Count == 0 ? null : pluginTypes.ToArray(); 
} 

cevap

10

XmlSerializer deserializing zaman kabul edilecek türde bir dizi kabul eden bir kurucu sahiptir.

6

David Norman'ın gösterdiği gibi, Xml Serializer'da bir dizi tür kullanabilirsiniz. Çok büyük bir uyarı. Bunu her yaptığınızda yeni bir xml serializer inşa edilir ve derlenir. Bunu çok yaparsanız, elinizde büyük bir bellek sızıntısı ve performans çenesi olacak.

Bu büyük bir bellek ve performans domuzudur, yalnızca bunu bir kez yaptığınızdan emin olun. MSDN'den http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

Snippet'ini: Eğer xml seri hale önbelleğe alarak bu çözebilirsiniz

dinamik oluşturuldu Meclisleri XML seri altyapısı dinamik serialize için toplantılar üretir, performansı artırmak ve belirtilen türde seriyi kaldırmak için. Altyapı bulur ve bu derlemeleri yeniden kullanır. aşağıdaki oluşturucular kullanarak yalnızca bu davranış oluşur:

XmlSerializer .. :: XmlSerializer (Tip)

XmlSerializer .. :: XmlSerializer (Tip, String)

Eğer birini kullanıyorsanız.. Diğer kurucular, 'un aynı derlemesinin birden çok sürümü oluşturulur ve hiçbir zaman boşaltılamaz, bu da bellek sızıntısına ve düşük performansa neden olur. En kolay çözüm, daha önce bahsedilen iki yapıcının bir 'unu kullanmaktır. Aksi halde, örneklerini aşağıdaki örneğinde gösterildiği gibi bir Hashtable içinde önbelleğe almalısınız.