我收到了一份文档,该文档定义了一组通过串行通信 channel 发送和接收的消息。我想接收传入的消息并将其反序列化为对象,并同时序列化出站消息。线路上的编码已建立且不可更改,并且由 header 中的各种位字段和变化的有效负载(例如

class Message{
int msg_num : 7
int dest_addr : 4
bool SRR : 1
bool IDE : 1
int source_addr : 6
//... and so on...
}

我看过使用protobufs,但看来他们的varint编码方法已经建立。我也查看了boost-serialization,但是根据我到目前为止所读的内容,那里的编码是如何完成的还不是很清楚。

因此,有几个问题:
  • 我可以使用boost-serialization将字节流转换为对象吗?
  • 的目标是不必滚动自己的例程进行序列化(维护困惑),是否存在一种用于完成任务的首选机制(例如,自定义的boost-serialization存档,我还没有发现的另一种方法)
  • 最佳答案

    我认为您找不到适合您所使用的自定义协议(protocol)的易于使用的序列化程序。但是看起来您拥有的一组原语(int,bool + size)足够简单,可以编写自己的解码器/编码器。仅根据收到的消息生成C/C++代码。生成带有这种描述的可编译代码应该是相当简单的任务。它应该是在编译时完成的自动生成-类似于protobuf/Corba所做的。

    示例:从规范:

    class Message{
        int msg_num : 7
        int dest_addr : 4
        bool SRR : 1
        bool IDE : 1
        int source_addr : 6
        //... and so on...
    }
    

    转换器可以编写类似于以下内容的函数(抽象符号并假定MSB):

    解码器:
    m = new Message()
    {
        long long val = 0
        for(int i=0; i<7; i++) {
            val <<= 8
            val += nextByte()
        }
        m.msg_num = val
    }
    {
        long long val = 0
        for(int i=0; i<4; i++) {
            val <<= 8
            val += nextByte()
        }
        m.dest_addr = val
    }
    {
        int val = nextByte()
        m.SRR = val
    }
    {
        int val = nextByte()
        m.IDE = val
    }
    {
        long long val = 0
        for(int i=0; i<6; i++) {
            val <<= 8
            val += nextByte()
        }
        m.source_addr = val
    }
    // and so on
    

    编码器:
    {
        long long val = m.msg_num
        for(int i=0;i<7;i++) {
            writeByte(val & 0xFF)
            val >>= 8
        }
    }
    {
        long long val = m.dest_addr
        for(int i=0;i<4;i++) {
            writeByte(val & 0xFF)
            val >>= 8
        }
    }
    ....
    

    这应该很容易生成,并且是确保编码自定义的最简单方法。

    09-10 04:44
    查看更多