C#通过1个套接字发送多个不同的对象

时间:2013-07-09 15:03:05

标签: c# sockets serialization deserialization tcpclient

我遇到了一个我不确定如何有效解决的问题。 我制作了一个可以通过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和其他东西,但我想用二进制序列化来做对象) 请记住,我对套接字/序列化一般都很陌生。

1 个答案:

答案 0 :(得分:1)

由于您使用的是二进制格式化程序,因此最有效的数据反序列化方法是使用二进制格式化程序的Deserialize方法。

此外,当您进行反序列化时,如果您想知道对象的类型,可以使用以下代码:

BinaryFormatter bf;
object obj =  bf.Deserialize(some_stream);
obj.GetType().Name;  // here you have the name of the class you just deserialized