2

我有两个进程客户端和服务器。这如下:这是我的客户进程:-

[Serializable ]
public class retobj
{
    public int a;

}
class client
{
    static void Main(string[] args)
    {
        TcpClient client = new TcpClient();
        client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5005));
        Console.WriteLine("Connected.");
        retobj ob = new retobj();
        ob.a = 90;
        BinaryFormatter bf = new BinaryFormatter();
        NetworkStream ns = client.GetStream();
        bf.Serialize(ns, ob);
        Console.WriteLine("Data sent.");
        Console.ReadLine();
        ns.Close();
        client.Close();
    }
}

这是我的服务器进程:

[Serializable]
public class retobj
{
    public int a;

}
class server
{
    static void Main(string[] args)
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 5005);
        listener.Start();
        Console.WriteLine("Server started.");
        Socket client = listener.AcceptSocket();
        Console.WriteLine("Accepted client {0}.\n", client.RemoteEndPoint);
        List<string> l = null;
        retobj j = null;
        using (NetworkStream ns = new NetworkStream(client))
        {
            BinaryFormatter bf = new BinaryFormatter();
            j = (retobj )bf.Deserialize(ns);
        }
        //if (l != null)
        //    foreach (var item in l)
        //        Console.WriteLine(item);
        Console.WriteLine(j.a);
        Console.ReadLine();
        client.Close();
        listener.Stop();
    }

但它给出了一个错误,如:服务器进程中的错误:无法找到程序集'ConsoleApplication45,Version = 1.0.0.0,Culture = Neutral,PublicKeyToken = null'。

4

1 回答 1

2

当您使用 序列化对象时BinaryFormatter,它包含有关该对象来自哪个程序集的信息。在服务器上对其进行反序列化时,它会读取该信息并从客户端程序retobj集中查找类的版本,这就是您收到该错误的原因。服务器上的不一样。

尝试将该类移动到类库项目,并从客户端和服务器引用该项目。你不需要两份。

另一种方法是使用不嵌入程序集信息的替代格式化程序,如DataContractSerializer 。

于 2012-11-03T04:06:05.207 回答