Serialization/Deserialization C#中C结构的字节流策略
Serialization/Deserialization strategy for byte stream of C structs in C#
我正在开发一个用 C# 编写的客户端应用程序,它应该与旧版应用程序(我们称之为服务器)进行通信。问题是服务器的 API 表示为一堆普通的旧 C 结构。每个结构都有一个 4 字节的 header 和它后面的数据。它只是一个字节流。
我知道这种特殊的二进制格式是独一无二的(由旧版服务器应用程序提供)。因此,不可能使用任何 SerDes 库,例如 Protocol Buffers,它使用其编码二进制数据的方式。
- 是否有任何 project/library 二进制序列化允许我指定消息类型(就像 protobuff 一样)及其二进制格式?我见过的每个库都是基于 JSON、XML 或专有二进制格式。
- 假设我决定编写自己的 SerDes 库(在 C# 中)。这样做的 best/recommended 策略是什么?我想以专业的方式去做,至少在我的生活中一次。谢谢!
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# 中执行相同的操作要容易得多。
祝你好运!
我正在开发一个用 C# 编写的客户端应用程序,它应该与旧版应用程序(我们称之为服务器)进行通信。问题是服务器的 API 表示为一堆普通的旧 C 结构。每个结构都有一个 4 字节的 header 和它后面的数据。它只是一个字节流。
我知道这种特殊的二进制格式是独一无二的(由旧版服务器应用程序提供)。因此,不可能使用任何 SerDes 库,例如 Protocol Buffers,它使用其编码二进制数据的方式。
- 是否有任何 project/library 二进制序列化允许我指定消息类型(就像 protobuff 一样)及其二进制格式?我见过的每个库都是基于 JSON、XML 或专有二进制格式。
- 假设我决定编写自己的 SerDes 库(在 C# 中)。这样做的 best/recommended 策略是什么?我想以专业的方式去做,至少在我的生活中一次。谢谢!
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# 中执行相同的操作要容易得多。
祝你好运!