2010-11-01 33 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]

相关问题