0

効率的に解決する方法がわからない問題があります。TCP ソケットを介して複数のクライアントを処理できるサーバーを作成しました。これらのクライアントは、データ (複数の異なるオブジェクト!) をサーバーに送信します。サーバーはオブジェクトを保存し、関心のあるすべてのクライアントに再送信します。

ここで、クライアントはバイナリ シリアル化された「オブジェクト」を受け取りますが、このオブジェクトがどのクラスから作成されているかはまったくわかりません。見つける方法は、クライアントとして送信されることがわかっているすべての可能なクラスで非シリアル化することです。成功したかどうかを確認します。ただし、後で逆シリアル化する 50 の異なるクラスがある場合、ソケットを介して多くのメッセージを取得すると、これは非常に非効率的であると想像できます。

シリアル化は次のコードで発生します。これはスレッドで実行され、現在はダミー データのみを送信します。

    public static void NotifyService()
    {
        Stream stream = client.GetStream();
        IFormatter formatter = new BinaryFormatter();
        while (true)
        {
            try
            {
                Class1 klas = new Class1();
                Class2 klasen = new Class2();
                formatter.Serialize(stream, klas);
                formatter.Serialize(stream, klasen);
            }
            catch (Exception e)
            {
                Console.WriteLine("Notifier got Exception, closing notify thread: " + e);
                break;
            }

        }
        stream.Close();
    }

問題は次のとおりです。クライアントがオブジェクトを適切に逆シリアル化するための最も効率的な方法は何でしょうか?

(XMLやその他のものを使用して、受信したものをそのまま送信する方法は他にもありますが、バイナリシリアライゼーションでオブジェクトを実行したかったのです)私は一般的にソケット/シリアライゼーションに非常に慣れていないことに注意してください。

4

1 に答える 1

1

バイナリ フォーマッタを使用しているため、データを逆シリアル化する最も効率的なDeserialize方法は、バイナリ フォーマッタのメソッドを使用することです。

また、逆シリアル化を行うときに、オブジェクトのタイプを知りたい場合は、次のコードを使用できます。

BinaryFormatter bf;
object obj =  bf.Deserialize(some_stream);
obj.GetType().Name;  // here you have the name of the class you just deserialized
于 2013-07-09T15:21:24.050 に答える