2010-05-24 50 views
2

我編寫了一個插件系統,並且我想保存/加載它們的屬性,以便在程序重新啓動時它們可以繼續工作。我使用二進制序列化。問題是他們可以被序列化但不是反序列化。 在反序列化期間「無法找到程序集」異常被拋出。我怎樣才能恢復序列化的數據?在C中對外部​​程序集進行序列化和反序列化#

+0

是否狀態,這集不會被發現? – Snake 2010-05-24 13:55:00

+0

是的。我寫的一個插件。但是它已經加載了,那麼它如何序列化呢? – Heka 2010-05-24 13:57:34

+0

我願意打賭,你的插件程序集並不是在反序列化時加載的。我知道你剛纔說過,但我會敦促你再看一遍。 – 2010-05-24 15:17:49

回答

4

確定這裏我找到了一些東西。 :)

http://techdigger.wordpress.com/2007/12/22/deserializing-data-into-a-dynamically-loaded-assembly/

我用這種方法,它的工作沒有任何問題。

杉杉定義粘合劑類:

internal sealed class VersionConfigToNamespaceAssemblyObjectBinder : SerializationBinder { 

     public override Type BindToType(string assemblyName, string typeName) { 

     Type typeToDeserialize = null; 

     try{ 

     string ToAssemblyName = assemblyName.Split(',')[0]; 

     Assembly[] Assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

     foreach (Assembly ass in Assemblies){ 

      if (ass.FullName.Split(',')[0] == ToAssemblyName){ 

       typeToDeserialize = ass.GetType(typeName); 

       break; 

      } 

     } 

     } 

     catch (System.Exception exception){ 

     throw exception; 

     } 

     return typeToDeserialize; 

     } 

    } 

然後序列化方法:

  public static byte[] Serialize(Object o){   

      MemoryStream stream = new MemoryStream(); 

      BinaryFormatter formatter = new BinaryFormatter(); 

      formatter.AssemblyFormat 

       = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 

      formatter.Serialize(stream, o); 

      return stream.ToArray(); 

      } 


      public static Object BinaryDeSerialize(byte[] bytes){ 

       MemoryStream stream = new MemoryStream(bytes); 

       BinaryFormatter formatter = new BinaryFormatter(); 

       formatter.AssemblyFormat 

        = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 

       formatter.Binder 

        = new VersionConfigToNamespaceAssemblyObjectBinder(); 

       Object obj = (Object)formatter.Deserialize(stream); 

       return obj; 

      } 

我使用他們,我需要。

  protected void SaveAsBinary(object objGraph, string fileName) 

      { 

       byte[] serializedData = Serialize(objGraph); 

       File.WriteAllBytes(fileName, serializedData); 

      } 


      protected object LoadFomBinary(string fileName) 

      {  

       object objGraph = null; 

       try 

       { 

       objGraph = BinaryDeserialize(File.ReadAllBytes(fileName)); 

       } 

       catch (FileNotFoundException fne) 

       { 

      #if DEBUG 

       throw fne; 

      #endif 

       }  

       return objGraph; 

      } 

感謝您的幫助:)

2

使用fuslogvw.exe工具找出CLR正在搜索程序集的位置。

+0

感謝它是一個非常有用的工具:) – Heka 2010-05-25 07:11:51

1

很可能,在您反序列化數據時,您的插件程序集未加載。因爲它是一個外部的插件程序集,所以我猜你明確地加載了它。您可能在加載程序集之前反序列化屬性對象。您可以通過在當前的AppDomain上掛接AssemblyResolve和AssemblyLoad事件來診斷和修復問題,並在調用它們時精確地觀察它們。

您還可以使用AssemblyResolve通過自己放置顯式的Assembly加載代碼並返回加載的程序集來修復加載錯誤。我不建議這樣做,因爲它有些倒退。

AssemblyResolve

+0

其實我加載程序集後調用反序列化。 – Heka 2010-05-25 07:12:49