2010-11-16 21 views
18

反序列化,我使用BinaryFormatter的序列化類實例的數組到一個文件中。我可以在同一個應用程序中反序列化這個罰款。當我嘗試在不同的應用程序相同的反序列化(在一個共同文件,做的工作是拉)然後我得到以下錯誤:如何獲得的BinaryFormatter在不同的應用程序

{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."} 

其中pmlscan是原始應用程序的名稱。如何讓BinaryFormatter不嘗試加載pmlscan?

回答

0

你不能!

最好的辦法是發佈在一個單獨的組件,您可序列化類,你是指它在服務器(串行)和客戶端(解串器)。這樣您就不會將整個源代碼發佈到外部世界。

+3

你在說的是.Net這裏。一切皆有可能。 (雖然單獨的程序集是最簡單的)。 – GvS 2010-11-16 13:16:28

+0

問題不在於加載和失敗。問題是「不嘗試並加載pmlscan」。 – Aliostad 2010-11-16 13:20:36

+0

使用assemblyRedirect你不會嘗試加載pmlscan。但是說「你不能!」,這是不正確的。由於這是一件複雜的事情,我原諒你,並沒有使你失望;-) – GvS 2010-11-16 13:24:45

3

二進制串行器將類和程序集信息編碼成二進制數組。當您反序列化這個數組時,反序列化器使用這些信息來定位類所在的程序集,並且(如果有必要)將程序集加載到您的應用程序域中。如果其他應用程序無法訪問類類型所在的程序集,則會看到您收到的錯誤。

正如另一個海報所提到的,把這些公共類到共享組件並將其部署到客戶端/應用程序等以及服務器應用程序。

+0

我的+1,先生... – Aliostad 2010-11-16 12:37:28

+2

那麼,你總是可以解決另一個程序集和兼容類型的反序列化。這是有效的,但不是因爲內心的弱點。 – leppie 2010-11-16 12:41:16

2

如果類是相同的,它只是一個組件,你可以嘗試你config文件添加assemblyBinding部分。

你也應該閱讀有關Resolving Assembly LoadsTypeResolve event文章。

使用這些技術,您可以在淨類型系統重定向到其他類型的反序列化。

注意:將您的共享類遷移到共享的.dll將是一個更簡單的解決方案。

1
sealed class PreMergeToMergedDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return Type.GetType("BinarySerialization.YourClass"); 
    } 
} 
BinaryFormatter bfDeserialize = new BinaryFormatter(); 
bfDeserialize.Binder = new PreMergeToMergedDeserializationBinder(); 
while (fsRead.Position < fsRead.Length) 
{ 
    YourClass sibla = (YourClass)bfDeserialize.Deserialize(fsRead); 
} 

假設你已經在你的「YourClass」串行數據解串的YourClass對象一個exe和另一exe文件。

相關問題