我已经制作了包含这些函数的TcpClient/Listener
类的包装器来发送/接收数据:
Function sendBytes(ByVal stream As NetworkStream, ByVal data As Byte()) As Boolean
Function receiveBytes(ByVal stream As NetworkStream) As Byte()
它们运行良好,但现在我希望发送的数据不仅仅是String
个对象和文件数据。
所以我希望然后创建这些可以发送/接收任何内容的函数:
Function send(ByVal stream As NetworkStream, ByVal obj As Object) As Boolean
Return sendBytes(stream, serialize(obj))
End Function
Function receive(ByVal stream As NetworkStream) As Object
Return deserialize(receiveBytes(stream))
End Function
(从一些研究,包括这个link,我认为协议缓冲区是紧凑性和速度方面最好的方法,所以我认为这就是我所做的事情。用于serialize()
和deserialize()
,虽然我最初可能以BinaryFormatter
类开头)
虽然这是理想的,但我不知道这是否是一种合理的方式来实现这一目标。除了复杂的对象,我没有其他的发送方式,我也会传递简单的对象,如字符串,Ints甚至Byte()数组已经有自己的方法转换成二进制(甚至根本不需要它)。
我不知道 - 序列化程序是否会对这些对象做额外的不必要的工作,特别是根本不需要更改的Byte()数组?
如果是这样,那么这是否意味着我应该实际编写发送/接收函数,以便它考虑不同类型的情况?这意味着:
Function send(ByVal stream As NetworkStream, ByVal obj As Object) As Boolean
Dim data As Byte()
Select Case obj.GetType
Case GetType(String)
data = Text.Encoding.ASCII.GetBytes(obj)
Case GetType(Int32)
data = BitConverter.ToInt32(obj)
Case GetType(Byte())
data = obj
Case ...
...
Case Else
data = serialize(obj)
End Select
Return sendBytes(stream, data)
End Function
和接收的等价物。 (我还需要添加一些描述发送对象类型的标题,以便接收函数知道如何处理它,尽管我还没有在上面的示例代码中包含它)
我只列出了一些我认为可能不需要序列化的类型作为示例,但当然还有更多(例如布尔值),因此(...)。
答案 0 :(得分:-1)
我建议您使用BinaryFormatter或(更好的)XmlSerializer来序列化数据。 XmlSerializer在大多数情况下都可以工作,并且您不需要在要使用的类之上应用任何属性(如果您必须序列化您不拥有代码的类型,这很有用。)
如果您使用XmlSerializer,那么您应该在发送之前对文本进行编码(类似于Base64)
我在尝试使用protobuf [see here]时遇到了问题,因此我不鼓励您为此特定情况使用协议缓冲区。