用于二进制消息序列化/反序列化的结构

本文关键字:反序列化 结构 序列化 二进制 消息 用于 | 更新日期: 2023-09-27 18:07:36

我是c#中的二进制新手,有一个关于最佳方法的问题。我有一个应用程序,我试图通信,有一个特定的二进制消息格式。它必须以B8十六进制码开始,以BB十六进制码结束,中间是二进制消息。获取字节缓冲区并将其强制转换为消息以方便访问消息属性的最佳方法是什么?我会想象一个结构体,但说实话,我真的不知道。

编辑:

我不想要二进制的原因是这样我可以很容易地在我的应用程序中使用数据。例如,我想将表示命令类型的二进制位转换为enum。像这样(只是我想做的一个表示):

struct CommandMessage
{
    public CommandType Command { get; set; }
    public object Data { get; set; }
}
enum CommandType
{
    UserJoined,
    MessageReceived
}

用于二进制消息序列化/反序列化的结构

我建议使用protobuf-net来序列化DTO

因此,定义一些实体,例如Package(在您的示例中是CommandMessage),它具有
public Command Command;

public byte[] Data;(与protobuf序列化)

基于Command,您将能够使用protobufData反序列化为具体的DTO类型。

如果您的消息应该以特殊前缀开头,您也可以在Package中处理此问题。此外,Package应该处理从二进制流或缓冲区写入/读取自身(这是相当直接的)。

e。g package.WriteTo(buffer)产生[BB,Command,Data,B8]package.ReadFrom()