我通过套接字连接(如果你想知道的话,是远程桌面频道)从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#代码了。
答案 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)
上面因此使我能够将类对象发送到网络管道,但是有很大的开销。