【发布时间】:2020-10-05 18:56:55
【问题描述】:
我正在开发一个用 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 代码的显式布局的结构(请参阅最后几个字段的“固定缓冲区”);然后你可以使用 spans 和 MemoeyMarshal.Cast,然后用 boom: byte[] in,输入数据
标签: c# serialization deserialization protocol-buffers marshalling