我是否需要创建单独的类别来序列化对象以通过TCP传输

时间:2016-08-23 14:38:57

标签: vb.net serialization tcp deserialization

我已经制作了包含这些函数的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

和接收的等价物。 (我还需要添加一些描述发送对象类型的标题,以便接收函数知道如何处理它,尽管我还没有在上面的示例代码中包含它)

我只列出了一些我认为可能不需要序列化的类型作为示例,但当然还有更多(例如布尔值),因此(...)。

1 个答案:

答案 0 :(得分:-1)

我建议您使用BinaryFormatter或(更好的)XmlSerializer来序列化数据。 XmlSerializer在大多数情况下都可以工作,并且您不需要在要使用的类之上应用任何属性(如果您必须序列化您不拥有代码的类型,这很有用。)

如果您使用XmlSerializer,那么您应该在发送之前对文本进行编码(类似于Base64)

我在尝试使用protobuf [see here]时遇到了问题,因此我不鼓励您为此特定情况使用协议缓冲区。