2009-06-08 23 views
2

情況:反序列化似乎不適用於IDE中的強命名對象

我有一堆坐在Web服務後面的業務對象。所有對象都封裝在一個BusObjects.DLL中,該對象是強命名的,並位於服務器上的GAC中(因爲服務器上的其他應用程序也可以訪問它)。

我有一個點擊一次的客戶端應用程序,它調用了上述的Web服務。該一次性應用程序也附帶此BusObjects.DLL。

Web服務將數據返回給客戶端的方式如下所示:它將業務對象序列化爲一個字節數組並將此字節數組返回給客戶端。客戶端將接收到的字節數組反序列化爲業務對象。這是可能的,因爲客戶端和服務器代碼都有對同一個BusObjects.DLL的引用。這一切都很好。

對我來說問題是這樣的。當我有客戶端的解決方案(其包括BusObjects項目)在VS2005 IDE,代碼無法字節數組反序列化回業務對象,因爲它聲稱,

「無法加載文件或組件 「CC.BusObjects, 版本= 2.12.1.47文化=中性, 公鑰= af56fdb58c626305」或 一個及其依賴的位於 集的清單定義並 不匹配組件參考 (從HRESULT異常:。0x80131040 )「

我試過匹配的版本,但是如果BusObjects項目被引用爲項目而不是外部程序集,似乎什麼都不起作用。不幸的是,我必須在解決方案內部有BusObjects進行調試。

我該怎麼辦才能解決這個問題?我聽說過版本重定向,但似乎無法使它與強大的命名組合工作,但也許我做錯了。

這裏是序列化和反序列化代碼:

public static byte[] ToBinary(Object objToBinary) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     BinaryFormatter formatter = new BinaryFormatter(null, 
        new StreamingContext(StreamingContextStates.Clone)); 
     formatter.Serialize(memStream, objToBinary); 
     memStream.Seek(0, SeekOrigin.Begin); 
     return memStream.ToArray(); 
    } 


    public static object BinaryTo(byte[] objFromBinary) 
    { 
     MemoryStream ms = new MemoryStream(objFromBinary); 
     BinaryFormatter formatter = new BinaryFormatter(); 
     ms.Position = 0; 
     object obj = formatter.Deserialize(ms); 
     return obj; 
    } 

要序列:

[WebMethod] 
public byte [] GetContacts() 
{ 
    return ToBinary(BusObjects.GetContacts()); 
} 

反序列化:

byte [] bts = ContactService.GetContacts(); 
List<Contact> lstContacts = (List<Contact>) BinaryTo(bts); 
+0

你在客戶端簽署組裝呢?那是在你的客戶端項目中,如果你去屬性 - >簽名,你有沒有相同的密鑰,服務器端用來簽署你的程序集? – 2009-06-08 22:26:56

+0

嗯,這是同一個項目,所以是的,它以同樣的方式簽名。 – AngryHacker 2009-06-08 22:44:00

+0

JP,你最初的預感是正確的。我去問那些做我們所有建造的人......事實證明,他們沒有使用我提供的密鑰,而是他們自己的密鑰,出於安全原因。 – AngryHacker 2009-06-08 23:12:00

回答

2

什麼是幾乎可以肯定發生的是你擁有的版本號集在構建過程中自動遞增。這通常會導致一個關閉的版本號場景,可能會導致您所看到的加載問題。

請嘗試以下

  • 轉到解決方案資源管理。
  • 展開屬性節點
  • 開放的AssemblyInfo.cs
  • 更改的AssemblyVersion屬性有一個硬編碼的版本號