2

クライアントとサーバーの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クラスのバージョンが検索されます。そのため、このエラーが発生します。サーバー上のものは同じではありません。

そのクラスをクラスライブラリプロジェクトに移動し、クライアントとサーバーの両方からそのプロジェクトを参照してみてください。2つのコピーは必要ありません。

別のアプローチは、アセンブリ情報を埋め込まないDataContractSerializerなどの代替フォーマッターを使用することです。

于 2012-11-03T04:06:05.207 に答える