繁体   English   中英

C#中C结构体字节流的序列化/反序列化策略

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

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

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

  • 是否有任何用于二进制序列化的项目/库允许我指定消息类型(如 protobuff 那样)及其二进制格式? 我见过的每个库都基于 JSON、XML 或专有的二进制格式。
  • 假设我决定编写自己的 SerDes 库(用 C#)。 这样做的最佳/推荐策略是什么? 我想以专业的方式做这件事,至少在我的生活中一次。 谢谢!

PS:我们只讨论小端。

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

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# 类。

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

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

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM