二进制反序列化不同.net项目中的vb.net类

时间:2017-04-27 23:05:43

标签: c# .net vb.net serialization

我通过套接字连接(如果你想知道的话,是远程桌面频道)从32位.net程序发送一些数据。我必须发送一些二进制数据(实际上是一些基本的电子邮件信息+ Outlook的文件附件)。电子邮件+主题是“文本”数据,但文件可以/当然是二进制文件。

所以我有一个像这样的结构(或类):

<Serializable>
Public Class oEmail
   ' we serialize this into one Byte() object - send to client and then deserlize
 Public Email As String         ' outlook email
 Public Subject As String       ' outlook subject
 Public CC As String            ' outlook CC
 Public BC As String            ' outlook bc (blind copy)
 Public MessageText As String   ' message text
 Public AttachPath As String    ' path name to attachment (with \)
 Public AttachFileName As String
 Public FileDat As New Byte()    ' any kind of windows file - to be attached to outlook
End Class

现在,二进制序列化“将”成为猫的喵喵。我可以采用上面的结构 - 将它序列化为一个字节数组,然后将其从网络管道发送到客户端然后进行软件化。

例如:

Dim MyOutlook As New oEmail
MyOutlook = Deserialize(Of oEmail)(MyData)

反序列化代码非常简单:

Public Shared Function Deserialize(Of T)(ByVal data As Byte()) As T
        Dim binFormat = New BinaryFormatter()

        Using M As New IO.MemoryStream(data, False)
            Return CType((New BinaryFormatter).Deserialize(M), T)
        End Using

End Function

但是,在客户端,它是一个64位应用程序。它也是.net,但是被RDP客户端称为外部非托管.dll,后者又运行托管代码。为了简短起见,我无法在客户端软件方面为上述类结构添加或使用SAME .dll。

所以,当我尝试在客户端进行反序列化时,我当然会得到这个超越令人讨厌的消息:

  

无法找到装配&#39; RDPSERVER&#39; ;版本1.0.0.0

令人遗憾的是.net不允许类的二进制序列化,除非您使用完全相同的.dll和程序集。 (为什么没有提供一些“松散”的序列化方法超出我的范围 - 但我不想在这里咆哮!)。我的意思是,取byte()数据 - 将其映射回类或结构!

有没有办法“覆盖”EXACT装配要求和不匹配问题?

哦,这么简单,人们可以分享.dll。但是,我可以在两个应用程序(客户端和服务器)之间共享源代码。

当然上面给出了装配错过的匹配。

我愿意考虑使用XML序列化程序(但它会传输二进制数据,例如文件完整吗?)。并且XML序列化也不会创建byte()数组。

有没有办法覆盖.net需要二进制序列化的“精确汇编”要求?

代码是vb.net,但是如果一个简单的c#代码允许覆盖程序集名称,我就可以使用c#代码了。

1 个答案:

答案 0 :(得分:0)

由于程序集未匹配(并且希望避免使用外部dll)。我会使用XML serlization。以下两个例程可以正常工作,但会增加3(

>发送的byte()数据的大小
   Public Shared Function SerializeXML(ByVal data As Object) As Byte()
        Dim ser As XmlSerializer = New XmlSerializer(data.GetType)
        Dim xBuff As New StringWriter

        ser.Serialize(xBuff, data)

        Return System.Text.Encoding.Unicode.GetBytes(xBuff.ToString)
    End Function


    Public Shared Function DeSerializeXML(Of T)(ByVal data As Byte()) As T
        Dim ser As New XmlSerializer(GetType(T))
        Dim XbUF As New MemoryStream
        XbUF.Write(data, 0, data.Length)
        XbUF.Position = 0
        Return ser.Deserialize(XbUF)
    End Function

所以一旦data()缓冲区沿着RDP通道发送,我就用这个:

       Dim MyEmailLoc As New oEmail

        MyEmailLoc = DeSerializeXML(Of oEmail)(MyData)

上面因此使我能够将类对象发送到网络管道,但是有很大的开销。