Serialization/Deserialization C#中C结构的字节流策略

Serialization/Deserialization strategy for byte stream of C structs in C#

我正在开发一个用 C# 编写的客户端应用程序,它应该与旧版应用程序(我们称之为服务器)进行通信。问题是服务器的 API 表示为一堆普通的旧 C 结构。每个结构都有一个 4 字节的 header 和它后面的数据。它只是一个字节流。

我知道这种特殊的二进制格式是独一无二的(由旧版服务器应用程序提供)。因此,不可能使用任何 SerDes 库,例如 Protocol Buffers,它使用其编码二进制数据的方式。

PS: 我们只讨论 little-endian。

这是服务器定义消息的方式:

struct Message1
{
    byte    Size;       // Header 1st byte
    byte    Type;       
    byte    ReqI;       
    byte    Zero;       //Header 4th byte.

    word    UDPPort;    // Actual data starts here.
    word    Flags;      

    byte    Sp0;        
    byte    Prefix;     
    word    Interval;   

    char    Admin[16];  
    char    IName[16];  
};

听起来你有固定大小的 c 结构通过套接字连接发送,你需要将它们解释为方便的 C# classes。

最简单的方法可能是在用托管 C++ 编写的代码中完成所有消息处理。因为你有一个结构,可能有一堆编译指示,我确信可以使它具有与通过套接字发送的结构相同的内存布局。然后,您还可以定义一个类似的托管 C++ class(例如,包含托管字符串而不是 char 数组)。您还可以编写代码,将结构字段逐字段转换为这些托管 classes 之一。将整个内容包装在一个 DLL 中,并将其作为依赖项包含在您的 C# 项目中。

这是因为托管 C++,虽然作为一种语言很奇怪,但它是非托管和托管代码与数据结构之间的桥梁要容易得多。无需编组任何东西,这是为您完成的。我用他的方法创建了调用 Windows 硬件发现工具的库,没有(或没有)任何 pre-existing C# 库。使用托管 C++ 代码调用必要的 win32 函数比从 C# 中执行相同的操作要容易得多。

祝你好运!