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

C# C中C结构字节流的序列化/反序列化策略#,c#,serialization,deserialization,protocol-buffers,marshalling,C#,Serialization,Deserialization,Protocol Buffers,Marshalling,我正在开发一个客户端应用程序,用C#编写,它应该与一个遗留应用程序(让我们称之为服务器)通信。问题是服务器的API被表示为一堆普通的旧C结构。每个结构都有一个4字节的头和它后面的数据。它只是一个字节流 我知道这种特殊的二进制格式是唯一的(由遗留服务器应用程序提供)。因此,不可能使用任何像协议缓冲区这样的SerDes库,协议缓冲区使用其编码二进制数据的方式 是否有任何二进制序列化项目/库允许我指定消息的类型(如protobuff)及其二进制格式?我见过的每个库都基于JSON、XML或专有二进制格

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

我知道这种特殊的二进制格式是唯一的(由遗留服务器应用程序提供)。因此,不可能使用任何像协议缓冲区这样的SerDes库,协议缓冲区使用其编码二进制数据的方式

  • 是否有任何二进制序列化项目/库允许我指定消息的类型(如protobuff)及其二进制格式?我见过的每个库都基于JSON、XML或专有二进制格式
  • 假设我决定写我自己的SerDes库(用C#)。这样做的最佳/推荐策略是什么?我想用专业的方式去做,至少一次。谢谢
附言:我们说的只是小恩迪安

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

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++编写的代码中的所有消息处理。这样你就有了一个结构,可能有一堆pragma,我确信可以使它具有与通过套接字发送的结构相同的内存布局。然后,您还定义了类似的托管C++类(例如,包含托管字符串而不是字符数组)。您还需要编写代码,将结构字段逐个字段转换为这些托管类之一。将整个过程封装在DLL中,并将其作为依赖项包含在C#项目中

原因是因为托管C++虽然是一种语言,但它在非托管代码和托管代码结构之间非常容易。没有必要马歇尔任何事情,这是为你做的。我用他的方法创建了一些库,这些库可以调用Windows的硬件发现设施,而这些设施没有(或没有)任何预先存在的C#库。使用托管C++代码调用必要的Win32函数比从C ^中做同样的事情要容易得多。
祝你好运

我不清楚C#应用程序将如何与遗留应用程序通信。如果旧版应用程序是非托管代码,则应查看封送处理、互操作和平台调用。如果遗留应用程序是托管代码,那么它应该更易于通信。遗留应用程序是非托管代码(它是用纯C编写的)。客户机和服务器之间的通信是使用标准套接字连接完成的。好吧,这样就没有序列化的空间了。您必须从网络流中读取字节并解析相应的文档。据我所知,序列化是一个两阶段的过程。数据在一端序列化,通过某种介质传输,在另一端反序列化以重新创建原始状态。提示:您可以在C#中创建结构,其显式布局完全模仿C代码(最后几个字段请参阅“固定缓冲区”);然后,您可以使用spans和MEMOEYMALLAR.Cast,以及boom:byte[]输入和输出键入的数据