通过tcpclient发送序列化对象的问题

时间:2010-11-01 07:53:39

标签: c# winforms serialization

我正在尝试通过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 个答案:

答案 0 :(得分:4)

好吧,正如错误消息所示,您的服务器无法找到WindowsFormsApplication1程序集。

在客户端吗?如果没有包含要反序列化的类型的所有程序集,则无法使用二进制反序列化。

请注意,命名空间是无关紧要的 - 并且您将无法仅仅因为在客户端程序集中有一个具有相同名称的类型而反序列化对象。程序集名称嵌入在序列化数据中。

(就我个人而言,我并不十分热衷于使用默认的.NET二进制序列化,因为它在向后和向前版本控制方面非常脆弱,但这是另一回事。如果你对替代品感兴趣,那么你可能希望查看基于文本的格式,如XML,YAML和JSON,或二进制格式,如Thrift和Protocol Buffers。)

答案 1 :(得分:2)

对于此问题,您需要编译和组装DLL库,然后将其添加为对两个项目的引用。请记住,DLL库中的所有类都必须是[Serializable]

答案 2 :(得分:1)

您需要将对WindowsFormsApplication1的引用添加到客户端。或者更好的是,为客户端和服务器共同的类添加单独的程序集。

答案 3 :(得分:-1)

我发现了如何通过将对象首先转换为xml然后转换为字符串来进行序列化的一个很好的尝试! http://www.dotnetjohn.com/articles.aspx?articleid=173

相关问题