代码改变世界

实用指南:【FastDDS】XTypes Extensions

2025-09-15 17:59  tlnshuju  阅读(18)  评论(0)    收藏  举报

XTypes 扩展

1. 概述

本节将介绍 XTypes 规范中定义的 QoS 策略扩展。

2. 数据表示 QoS 策略(DataRepresentationQosPolicy)

此 XTypes QoS 策略规定了 DataWriter 和 DataReader 将要运用的数据表示形式。

DataWriter 会提供一种数据表示形式,用于与匹配的 DataReader 进行通信。DataReader 可以请求一种或多种数据表示形式,并且为了能与 DataWriter 进行通信,DataWriter 所提供的数据表示形式需要包含在 DataReader 的请求中。详见 <DataRepresentationQosPolicy>

2.1 QoS 策略数据成员列表

数据成员名称类型默认值DataReader 默认值DataWriter 默认值Topic 默认值
m_valuestd::vector空向量[XCDR_DATA_REPRESENTATION, XCDR2_DATA_REPRESENTATION][XCDR2_DATA_REPRESENTATION][XCDR_DATA_REPRESENTATION]

2.2 注意事项

此 QoS 策略适用于 Topic、DataReader 和 DataWriter 实体。它不能在已启用的实体上更改。

2.3 DataRepresentationId

有三个可能的值(参见 <DataRepresentationId>):

  • XCDR_DATA_REPRESENTATION:此选项对应于扩展 CDR 表示编码的第一个版本。
  • XML_DATA_REPRESENTATION:此选项对应于 XML 数据表示形式。
  • XCDR2_DATA_REPRESENTATION:此选项对应于扩展 CDR 表示编码的第二个版本。

2.4 示例

2.4.1 C++
// 此示例使用 DataWriter,但它也可应用于 Topic 实体。
// DataReader 的 DataRepresentationQosPolicy 包含在 TypeConsistencyQos 中
//(有关更多详细信息,请参见 TypeConsistencyQos 部分)。
DataWriterQos writer_qos;
// 将 XCDR v1 数据表示形式添加到有效表示形式列表中
writer_qos.representation().m_value.push_back(DataRepresentationId_t::XCDR_DATA_REPRESENTATION);
// 将 XML 数据表示形式添加到有效表示形式列表中
writer_qos.representation().m_value.push_back(DataRepresentationId_t::XML_DATA_REPRESENTATION);
// 在相应实体的创建中使用修改后的 QoS
writer_ = publisher_->
create_datawriter(topic_, writer_qos);
2.4.2 XML

目前,此 QoS 策略无法启用 XML 进行配置。

3. 类型一致性实施 QoS 策略(TypeConsistencyEnforcementQosPolicy)

警告
此 QoS 策略将在未来版本中达成。

此 XTypes QoS 策略扩展定义了用于确定 DataWriter 中使用的数据类型与 DataReader 中使用的数据类型是否一致的规则。参见 <TypeConsistencyEnforcementQosPolicy>

3.1 QoS 策略素材成员列表

素材成员名称类型默认值
m_kindTypeConsistencyKindALLOW_TYPE_COERCION
m_ignore_sequence_boundsbooltrue
m_ignore_string_boundsbooltrue
m_ignore_member_namesbooltrue
m_prevent_type_wideningbooltrue
m_force_type_validationbooltrue

3.2 成员说明

  • m_kind:确定 DataWriter 类型中的类型是否必须与 DataReader 中的类型相等。有关更多详细信息,请参见 TypeConsistencyKind。
  • m_ignore_sequence_bounds:此数据成员控制在类型可赋值性中是否考虑序列边界。如果其值为 true,则不考虑序列的最大长度,这意味着长度为 L2 的序列 T2 可赋值给长度为 L1 的序列 T1,即使 L2 大于 L1。但如果为 false,则 L1 必须大于或等于 L2 才能认为序列是可赋值的。
  • m_ignore_string_bounds:控制在类型赋值中是否考虑字符串边界。如果其值为 true,则不考虑字符串的最大长度,这意味着长度为 L2 的字符串 S2 可赋值给长度为 L1 的字符串 S1,即使 L2 大于 L1。但如果为 false,则 L1 必须大于或等于 L2 才能认为字符串是可赋值的。
  • m_ignore_member_names:此布尔值控制在类型可赋值性中是否考虑成员名称。如果为 true,除了成员 ID 之外,成员名称也被视为可赋值性的一部分,这意味着具有相同 ID 的成员也必须具有相同的名称。但如果值为 false,则忽略成员名称。
  • m_prevent_type_widening:此数据成员控制是否允许类型拓宽。如果为 false,则允许类型拓宽;但如果为 true,则较宽的类型不能赋值给较窄的类型。
  • m_force_type_validation:控制服务是否需要类型信息来完成 DataWriter 和 DataReader 之间的匹配。如果启用,它必须具有完整的类型信息,否则不需要。

3.3 注意事项

此 QoS 策略适用于 DataReader 实体。它不能在已启用的实体上更改。

3.4 TypeConsistencyKind

有两个可能的值:

  • DISALLOW_TYPE_COERCION:DataWriter 和 DataReader 必须支持相同的数据类型才能进行通信。
  • ALLOW_TYPE_COERCION:DataWriter 和 DataReader 不需要支持相同的数据类型即可通信,只要 DataReader 的类型可从 DataWriter 的类型赋值即可。