【问题标题】:C# send multiple different objects over 1 socketC# 通过 1 个套接字发送多个不同的对象
【发布时间】:2013-07-07 06:16:48
【问题描述】:

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

【问题讨论】:

  • 你用什么代码进行二进制序列化?
  • 添加了用于序列化的代码。

标签: c# sockets serialization deserialization tcpclient


【解决方案1】:

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

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

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

【讨论】:

  • 真的就这么简单吗?凉爽的!我马上去试试,谢谢!
  • 如果我反序列化,但保留在一个对象上(从不将它转换为我序列化它时的样子)我是否仍然需要可用的原始类才能进行反序列化?
  • “可用”是什么意思?您的意思是“我需要加载包含该类的程序集吗?”
  • 我已经得到了答案,似乎要让我的服务器从中制作一个对象,然后让它将该对象发送给其他客户端,我的服务器要么需要知道它是什么类类型等. 或者我保持二进制,我需要知道我在服务器上收到的包的长度
猜你喜欢
  • 2014-11-13
  • 1970-01-01
  • 2017-03-20
  • 2013-09-02
  • 1970-01-01
  • 2012-03-13
  • 2012-08-09
相关资源
最近更新 更多