Межпроцессное взаимодействие на одной машине с использованием tcp

У меня есть два процесса: клиент и сервер. Это выглядит следующим образом: Это мой клиентский процесс: -

[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, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null».


person yuthub    schedule 03.11.2012    source источник


Ответы (1)


Когда вы сериализуете объект с помощью BinaryFormatter, он включает информацию о том, из какой сборки получен объект. При десериализации на сервере он считывает эту информацию и ищет версию класса retobj из клиентской сборки, поэтому вы получаете эту ошибку. Тот, что на сервере, не тот.

Попробуйте переместить этот класс в проект библиотеки классов и ссылаться на этот проект как с клиента, так и с сервера. Вам не нужны две копии.

Альтернативным подходом может быть использование альтернативного модуля форматирования, такого как DataContractSerializer, который не включает информацию о сборке.

person Chris Shain    schedule 03.11.2012