14.1. Overview of Dynamic Types
本文主要描述了FastDDS中动态数据类型的相关内容,在文章的最后会有一个简短的例子来展示如何使用动态数据类型。
14.1.1. 涉及到的类
下面这个类图描述了与动态数据类型功能关联的类的类关系图。
14.1.1.1. DynamicType
DynamicType是所有动态数据类型的父类,他代表了是一种动态数据类型,并且可被用于创建DynamicData对象。
一个DynamicType的结构(就是他包含的成员DynamicTypeMember)在被创建后就无法修改。
14.1.1.2. DynamicTypeBuilderFactory
DynamicTypeBuilderFactory是DynamicTypeBuilder的工厂类,其是一个单例类,用于管理每个DynamicType和其对应的DynamicTypeBuilder。
DynamicTypeBuilderFactory会创建所支持的每个DynamicType类型的Builder对象,通过Builder对象,DynamicTypeBuilderFactory可以创建对应的DynamicType。
某些简单的DynamicType可以直接被Factory创建而不需要通过Builder,因此可以省去创建这些Builder的步骤, Supported Types 链接中包含了这些可以不通过Builder直接创建的DynamicType。
14.1.1.3. DynamicTypeBuilder
DynamicTypeBuilder类用于在DynamicTypeBuilderFactory创建DynamicType之前对其进行配置,由于DynamicType在创建后就无法修改其内部成员结构,因此,其内部成员结构就是在Factory创建其之前由对应的Builder类对象进行配置(也就是说DynamicType类的结构是保存在DynamicTypeBuilder中的)。
DynamicTypeBuilder内部完成对所关联的DynamicType结构的配置后,DynamicTypeBuilderFactory 就可以根据该配置创建出对应的DynamicType。通过DynamicTypeBuilder对外接口 build()
,DynamicTypeBuilderFactory 可以获取到包含完整结构(DynamicTypeMember)的DynamicType。
根据内存管理约束( Memory management),创建出来的DynamicType也是需要DynamicTypeBuilderFactory需要在最后删除这个DynamicType。
DynamicTypeBuilder可以被重复使用,如果DynamicType的内部结构,那么只需要调整DynamicTypeBuilder中的配置即可,但是,这个不会影响到已经被Factory创建出来的DynamicType。
14.1.1.4. TypeDescriptor
TypeDescriptor描述了DynamicType的内部结构,而DynamicTypeBuilder内部就存储了一个TypeDescriptor对象用作DynamicType的配置。
当DynamicTypeBuilderFactory创建DynamicType的时候,会用到TypeDescriptor中的信息,并且会将TypeDescriptor拷贝到创建出来的DynamicType中。
14.1.1.5. DynamicTypeMember
DynamicTypeMember代表了DynamicType内部的成员的类型,而且DynamicTypeMember其实也是DynamicType。
对于DynamicType中的每个子类型,都有一个对应的DynamicTypeMember对应该子类型。
14.1.1.6. MemberDescriptor
MemberDescriptor的功能类似TypeDescriptor,TypeDescriptor用于存储DynamicType的内部结构,而MemberDescriptor用于存储DynamicTypeMember的内部结构(例如名称,UID,默认值),并且MemberDescriptor也会在创建DynamicTypeMember时拷贝到DynamicTypeMember内部。
14.1.1.7. DynamicData
DynamicData代表DynamicType类型的一个实例对象(就如同int a;int是type,a是data),其提供了一组方法用于访存内部的值。
有两种操作DynamicData的方法:
-
激活使能
DYNAMIC_TYPES_CHECKING
宏,这个宏会为每个DynamicType创建一个变量用于调试 -
不适用
DYNAMIC_TYPES_CHECKING
,这种情况下,DynamicType的大小是被缩减的。
14.1.1.8. DynamicDataFactory
DynamicDataFactory是个单例类,用于创建和管理每个DynamicData。其使用DynamicType中的配置来创建该DynamicType的DynamicData实例对象。
每个DynamicData都是通过DynamicDataFactory来创建的,当然也需要以来DynamicDataFactory来删除以防止内存泄漏。
此外,还可以从TypeDescriptor创建一个 TypeIdentifier
和 (Minimal 或者 Complete) TypeObject
对象。
14.1.1.9. DynamicPubSubType
DynamicPubSubType是一个适配器类,可以让DynamicData在FastDDS上运行。DynamicPubSubType从 TopicDataType
接口继承而来,并且实现接口中的方法,这些方法用于在发布着和订阅者之间传输DynamicData。
14.1.2. Minimum example
下面是一个简短的代码例子,用于展示使用DynamicType的方法以及前文提到的那些类是如何协作的。
// Create a builder for a specific type
DynamicTypeBuilder_ptr builder = DynamicTypeBuilderFactory::get_instance()->create_enum_builder();
// Use the builder to configure the type
builder->add_empty_member(0, "DEFAULT");
builder->add_empty_member(1, "FIRST");
builder->add_empty_member(2, "SECOND");
// Create the data type using the builder
// The builder will internally use the DynamicTypeBuilderFactory to create the type
DynamicType_ptr type = builder->build();
// Create a new data instance of the create data type
DynamicData_ptr data (DynamicDataFactory::get_instance()->create_data(type));
// Now we can set or read data values
data->set_int32_value(1);
// No need of deleting the objects, since we used the
// automanaged smart pointers