【问题标题】:How to identify type by hash value?如何通过哈希值识别类型?
【发布时间】:2012-05-23 22:20:09
【问题描述】:

所以我有基本的 UDP 服务器,我已经实现了一些东西,比如完全恢复字节数组是如何由客户端发送的(如果它被无序检索)。基本上,我有客户端、服务器和具有类型的共享类库,其对象可以从客户端发送到服务器,反之亦然。所以现在我想到了序列化一些对象并发送到服务器/客户端的想法。但我需要知道收到了什么类型的对象才能正确反序列化它。想到了两个想法来解决这个问题:

  • 进行“握手”。发送有关将要发送的对象、其长度、类名等的数据。在它检索实际数据并对其进行反序列化之后。我知道这样做,但是由于它是 UDP,所以这个“握手”可能会丢失,我需要重新请求它,所以逻辑和网络过度使用非常复杂,但我知道如何实现。
  • 第二个是通过一些哈希值来识别类型。所以客户端发送包含类型哈希值和数据片段的数据(我只会发送我自己的类型的对象,所以不需要为 C# 和框架类型实现这个),我需要通过这个哈希值来确定类型,服务器可以适当地去实现它。

那么有什么想法,如何实现呢?如果我设法避免反射,那将是完美的,因为它很慢(如果它工作得更快,我不在乎巨大的 switch 语句)

【问题讨论】:

  • 我假设您有自己的协议,因为您通过 UDP 发送字节。所以我会说有一两个保留字节,您可以使用它来确定您正在发送/接收的对象类型。这取决于你。
  • 不,现在只是标准binary serialization
  • 这个想法仍然存在:你可以在对象之前发送一个序列化的类型来表示即将到来的内容

标签: c# serialization hash udp client-server


【解决方案1】:

我今天刚刚为我正在制作的原型做了这个。我这样定义了我的消息流:

前 4 个字节:作为 Int32 的程序集限定类型名称的长度。

接下来的 n 个字节(其中 n 由前 4 个字节给出):类型的程序集限定名称。

消息的其余部分:序列化对象

它就像一个魅力。

【讨论】:

  • 并使用反射将类型转换为所需类型?
  • @Dantix Casting 是一个静态编译时概念;您不能强制转换仅在运行时才知道的类型。你认为什么情况需要演员阵容?如果您调用的方法采用比object 更具体的类型,您将不得不使用反射来调用该方法。当您在MethodInfo 上调用Invoke 时,参数将在object 数组中传递;有运行时类型检查,但没有静态转换。
  • 另外,添加消息长度的 int 值以检查是否检索到完整消息或仅部分消息
  • @Dantix 好想法。我很高兴我的项目只是一个原型 :-)
【解决方案2】:

只需将对象类型作为对象数据的一部分,然后使用完全相同的逻辑发送它们即可。不要尝试在网络级别单独处理它们。

【讨论】:

  • 在反序列化之前我应该​​知道类型 :)
  • 对,但那是收到后。所以这对网络层来说不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2016-09-19
  • 2011-01-08
  • 2020-12-31
  • 1970-01-01
  • 2018-02-18
  • 2013-05-01
相关资源
最近更新 更多