3.2.1 C++ 实现

1.序列化

demo_cc/tools 目录下新建C++ 文件 demo01_record_write.cc,输入如下内容:

/*  

    将话题消息写入磁盘文件。
    实现:
        1.初始化 cyber 框架;
        2.创建 recorder 写对象;
        3.设置写出参数;
        4.打开文件流;
        5.写出消息类型以及消息数据;
        6.关闭文件流。


*/
#include "cyber/cyber.h"
#include "cyber/record/record_writer.h"
#include "cyber/demo_base_proto/student.pb.h"
using apollo::cyber::record::RecordWriter;

int main(int argc, char *argv[])
{

    apollo::cyber::Init(argv[0]);
    AINFO << "record 写操作演示...";
    // 2.创建 recorder 写对象;
    RecordWriter writer;
    // 3.设置写出参数;
    writer.SetSizeOfFileSegmentation(0);
    writer.SetIntervalOfFileSegmentation(0);
    // 4.打开文件流;
    writer.Open("/apollo/cyber/demo_cc/tools/mytest.record");
    AINFO << "file : " << writer.GetFile();

    // 5.写出消息类型以及消息数据;
    std::string channel = "chatter";
    writer.WriteChannel(channel,"apollo.cyber.demo_base_proto.Student","test ....");
    // writer.WriteMessage    
    for (size_t i = 0; i < 100; i++)
    {
        auto stu = std::make_shared<apollo::cyber::demo_base_proto::Student>();
        stu->set_name("huluwa");
        stu->add_books("yingyu");
        stu->add_books("yuwen");
        // stu->SerializeAsString();
        std::string content;
        stu->SerializeToString(&content);
        writer.WriteMessage(channel,content,i);
        // writer.WriteMessage(channel,stu->SerializeAsString(),i);

    }

    // 6.关闭文件流。
    writer.Close();


    return 0;
}

配置BUILD文件添加内容如下:

cc_binary(
    name = "demo01_record_write",
    srcs = ["demo01_record_write.cc"],
    deps = [
        "//cyber",
        "//cyber/demo_base_proto:student_cc",
    ],
)

2.反序列化

demo_cc/tools 目录下新建C++ 文件 demo02_record_read.cc,输入如下内容:

#include "cyber/cyber.h"
#include "cyber/record/record_reader.h"
#include "cyber/record/record_message.h"

using apollo::cyber::record::RecordReader;
using apollo::cyber::record::RecordMessage;
int main(int argc, char *argv[])
{
    apollo::cyber::Init(argv[0]);

    AINFO << "record 读操作演示...";
    RecordReader reader("/apollo/cyber/demo_cc/tools/mytest.record");
    std::string channel = "chatter";
    uint64_t msg_count = reader.GetMessageNumber(channel);
    AINFO << "总共" << msg_count << "条消息";
    std::string msg_type = reader.GetMessageType(channel);
    std::string msg_desc = reader.GetProtoDesc(channel);
    AINFO << "消息类型:" << msg_type;
    AINFO << "消息描述:" << msg_desc;
    RecordMessage msg;
    for (size_t i = 0; i < msg_count; i++)
    {
        if(reader.ReadMessage(&msg)){
            AINFO << "第" << i << "条消息 -> " 
                  << "channel name: " << msg.channel_name
                  << "; content: " << msg.content
                  << "; msg time: " << msg.time;
        } else  {
            AINFO << "消息读取失败.....";
        }
    }


    return 0;
}

配置BUILD文件添加内容如下:

cc_binary(
    name = "demo02_record_read",
    srcs = ["demo02_record_read.cc"],
    deps = [
        "//cyber",
        "//cyber/demo_base_proto:student_cc",
    ],
)

3.编译执行

编译:

bazel build cyber/demo_cc/tools/...

执行:

source cyber/setup.bash

先执行序列化操作(执行完毕将在 demo_cc/tools 目录下生成一个名为 mytest.record 的用于保存消息数据的文件)

./bazel-bin/cyber/demo_cc/tools/demo01_record_write

再执行反序列化操作(执行完毕将在终端输出文件中保存的消息内容)

./bazel-bin/cyber/demo_cc/tools/demo02_record_read

results matching ""

    No results matching ""