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