roscpp_serialization序列化

其功能为进行序列化和反序列化

上图展示了各个头文件的包含关系,即

值得注意的是,boost是相当值得学习的。

首先是roscpp_serizlization_macros.h该文件的功能为定义ROSCPP_SERIALIZATION_DECL宏是否用于在构建ros的序列化功能时进行导出和导入符号的声明。

(该部分的功能为,如果定义的为动态库,那么即为导出符号,如果定义的为静态库,就不是导出符号(为空))

关于导出和导入符号:

  1. C++代码, 当一个库被编译为共享库时,该库的代码和数据是放在一个动态链接库中,而不是和可执行程序一起静态链接。因此其他程序可以在运行时动态地加载和链接 这个库,从而使用这个库中定义的函数和数据。

  2. 在共享库中定义的符号(函数名、变量名等)并不是直接暴露给调用这个共享库的其他可执行程序的,因为这会导致符号冲突问题。为了解决这个问题,共享库提供了导出符号(Export Symbols)的机制,即让共享库以外的程序能够访问共享库中定义的特定符号。导出符号可以通过特定的编译选项或者预处理指令来实现

  3. 当一个共享库被加载到内存中时,系统会为该库分配一段地址空间,并将其中的函数和变量的地址注册到一个全局符号表中。这些被注册的符号即为导出符号,它们可以被其他程序通过符号名字来调用或访问。

  4. 使用共享库时,程序需要通过链接器(Linker)来解析和查找导出符号。链接器会根据符号名字在全局符号表中查找对应的地址,并将其与程序中的调用或访问点进行关联,从而使得程序能够正确地调用共享库中的函数或访问其中的变量。

  • 使用共享库----链接器--- 导出符号--- 相应共享库中的函数和变量

serialized_message.h文件

功能:用于处理ROS消息的序列化和反序列化的存储,作为一个中转站,便于上层接口直接调用。放在一个公用的接口里面,通过这个接口来存储序列化和反序列化的数据。用户层可以直接调用这个公用的接口去获取序列化和反序列化的数据

其核心代码为SerializedMessage类

#ifndef ROSLIB_SERIALIZED_MESSAGE_H
#define ROSLIB_SERIALIZED_MESSAGE_H

#include "roscpp_serialization_macros.h"

#include <boost/shared_array.hpp>
#include <boost/shared_ptr.hpp>

namespace ros
{

class ROSCPP_SERIALIZATION_DECL SerializedMessage
{
public:
  boost::shared_array<uint8_t> buf;    //存储被序列化的消息的字节流
  size_t num_bytes;  //存储字节流的长度
  uint8_t* message_start;  //指向消息字节流的起始位置的指针

  boost::shared_ptr<void const> message;  //用于储存反序列化后的消息
  const std::type_info* type_info;   //用于储存消息的类型信息

  SerializedMessage()
  : buf(boost::shared_array<uint8_t>())
  , num_bytes(0)
  , message_start(0)
  , type_info(0)
  {}

  SerializedMessage(boost::shared_array<uint8_t> buf, size_t num_bytes)
  : buf(buf)
  , num_bytes(num_bytes)
  , message_start(buf ? buf.get() : 0)
  , type_info(0)
  { }
};

} // namespace ros

#endif // ROSLIB_SERIALIZED_MESSAGE_H

重要!!

序列化部分的代码框架为:

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值