gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:17:26 26 4
gpt4 key购买 nike

我正在通过套接字连接(如果您想知道的话,这是一个远程桌面 channel )从 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,后者又运行托管代码。长话短说,我无法在客户端软件端为上述类结构添加或使用相同的 .dll。

因此,当我尝试在客户端反序列化时,我当然会得到这个 BEYOND 讨厌的消息:

Unable to find assembly 'RDPSERVER' ; Version 1.0.0.0

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

有什么方法可以“覆盖”精确装配要求和不匹配问题吗?

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

当然上面给出了程序集不匹配。

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

有没有办法覆盖 .net 对二进制序列化的“精确组装”要求?

代码是 vb.net,但如果一段简单的 C# 代码允许覆盖程序集名称,我愿意使用 C# 代码。

最佳答案

因为程序集不匹配(并且想避免外部 dll)。我会使用 XML 序列化。以下两个例程确实有效,但将发送的 byte() 数据的大小增加了 3 倍

   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 channel ,我就使用这个:

       Dim MyEmailLoc As New oEmail

MyEmailLoc = DeSerializeXML(Of oEmail)(MyData)

因此,以上内容使我能够将类对象发送到网络管道,但开销很大。

关于c# - 二进制反序列化不同 .net 项目中的 vb.net 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43669298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com