2010-11-01 93 views
1

我想通過tcpclient從服務器發送一個對象到客戶端,並且出現錯誤。首先,這裏是包類:通過tcpclient發送序列化對象的問題

[Serializable()] 
    public class pack 
    { 
     public int a; 
    } 

這裏是服務器的發送代碼(它的命名空間是WindowsFormsApplication1):

   pack pachet = new pack(); 
       pachet.a = 3; 
       IFormatter bformatter = new BinaryFormatter(); 
       NetworkStream ntstream = tcpClient.GetStream(); 
       bformatter.Serialize(ntstream, pachet); 

和客戶端的「翻譯」的代碼(它的命名空間是WindowsFormsApplication2):

  NetworkStream strm = client.GetStream(); 
      IFormatter bformatter = new BinaryFormatter(); 
      pack nettmp = (pack)bformatter.Deserialize(strm); 

和錯誤是:

serializationException was unhandeled. Unable to find assembly 'WindowsFormsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

有人能告訴我問題是什麼嗎?

回答

4

那麼,正如錯誤消息所述,您的服務器找不到WindowsFormsApplication1程序集。

你有它在客戶端嗎?如果沒有包含要反序列化的類型的所有程序集,則無法使用二進制反序列化。

請注意,命名空間是無關緊要的 - 僅僅因爲在客戶端程序集中有一個具有相同名稱的類型,您將無法反序列化對象。程序集名稱嵌入在序列化數據中。我個人並不十分熱衷於使用默認的.NET二進制序列化,因爲它在向後和向前版本方面非常脆弱,但這是另一回事,如果您對替代方案感興趣,你可能想看看基於文本的格式,如XML,YAML和JSON,或二進制格式,如節儉和協議緩衝區。)

+0

好的..從我​​的理解,我需要用pack類製作一個.dll文件。我會研究出口/導入在XML然後。謝謝 – Alex 2010-11-01 08:06:26

+0

@Badescu:那麼,你現有的裝配也會起作用。 (你也應該強烈地考慮下面的.NET命名約定,其中類型是Pascal的。) – 2010-11-01 09:46:16

+0

感謝xml提示。我已經使用它,它工作得很好。 – Alex 2010-11-01 13:47:21

1

您需要將對WindowsFormsApplication1的引用添加到客戶端。或者更好的是,爲客戶端和服務器共同的類添加一個單獨的程序集。

+0

裝配你的意思是一個.dll? – Alex 2010-11-01 08:09:35

2

對於此問題,您需要編譯和組裝DLL庫,然後將其作爲對兩個項目的引用添加。請記住,DLL庫中的所有類都必須是[Serializable]

相關問題