簡體   English   中英

通過tcpclient發送序列化對象的問題

[英]problem with sending serialized object over tcpclient

我試圖通過tcpclient將對象從服務器發送到客戶端,但出現錯誤。 首先,這是pack類:

[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'.

有人可以告訴我問題是什么嗎?

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

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

請注意,名稱空間是無關緊要的-您將無法反序列化對象,只是因為您在客戶端程序集中具有相同名稱的類型。 程序集名稱嵌入在序列化數據中。

(個人而言,我並不是很熱衷於使用默認的.NET二進制序列化開始,因為它在向后和向前版本控制方面非常脆弱,但這是另一回事。如果您對替代方法感興趣,則可能需要查看基於文本的格式(例如XML,YAML和JSON)或二進制格式(例如Thrift和Protocol Buffers)。)

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

您需要向客戶端添加對WindowsFormsApplication1的引用。 或者更好的是,為客戶端和服務器都通用的類添加單獨的程序集。

我發現如何通過先將對象轉換為xml然后轉換為字符串來進行序列化的方法很不錯! http://www.dotnetjohn.com/articles.aspx?articleid=173

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM