跳到主要内容

使用结构化数据

SDT(Structured Data Types,结构化数据类型)是结构化的、与语言无关的、与架构无关的数据类型。SDT 可以用于消息中,以便在具有不同硬件架构和编程语言的客户端的异构网络中交换二进制数据。

C、JavaScript、Node.js 和 .NET 消息 API 支持在消息的二进制附件中或作为用户定义的消息头字段中携带结构化数据。

PubSub+ Java RTO API 不支持使用结构化数据类型。

所有结构化数据必须添加到或从复杂数据结构(映射和流)中读取,这些结构通常被称为容器。容器本身是结构化数据类型。因此,映射或流可以包含简单的 SDT 类型或其他映射或流。

  • 有关如何在发布和接收消息时使用 SDT 的示例,请参考 C 和 .NET API 的 RRDirectRequesterRRDirectReplierRRGuaranteedRequesterRRGuaranteedReplier 示例,以及 JavaScript 和 Node.js API 的 BasicRequestorBasicReplier 示例。
  • 有关如何为消息添加 SDT 负载的示例,请参考 SDTPubSubMsgIndepSDTPubSubMsgDep 示例。
    • SDTPubSubMsgIndep 示例中,SDT 容器是使用应用程序内存创建的(C 和 .NET API 允许)。
    • SDTPubSubMsgDep 示例中,SDT 容器是使用 API 控制的内存创建的(仅 C 和 .NET API 允许)。

有关使用应用程序内存或 API 控制的内存创建 SDT 容器的更多信息,请参阅创建结构化数据映射和流。

支持的结构化数据类型

消息 API 支持以下 SDT。

数据类型C API.NET APIJavaScript 和 Node.js API
布尔值solClient_bool_tSystem.Booleanboolean
8 位有符号整数solClient_int8_tSystem.Int16number
8 位无符号整数solClient_uint8_tSystem.Bytenumber
16 位有符号整数solClient_int16_tSystem.Int16number
16 位无符号整数solClient_uint16_tSystem.Int16number
32 位有符号整数solClient_int32_tSystem.Int32number
32 位无符号整数solClient_uint32_tSystem.Int64number
64 位有符号整数solClient_int64_tInt64number
支持 48 位整数(范围:0 到 2^48-1)。在编码时,仅考虑低 48 位有效。
64 位无符号整数solClient_uint64_tInt64(当没有精度损失时)number
支持 48 位整数(范围:0 到 2^48-1)。在编码时,仅考虑低 48 位有效。
32 位浮点数floatfloatnumber
单精度浮点数。
64 位浮点数doubledoublenumber
双精度浮点数。
字符(16 位 Unicode)solClient_wchar_tSystem.Charstring
单个字符。
字节数组solClient_uint8_tbyte[]Int8Array
字符串(UTF-8 编码)const char *System.stringstring
目标(主题或队列物理名称)solClient_destination_tIDestinationsolace.Destination
SMF 消息solclient_uint8_t *IMessagesolace.Message
映射(一个结构化数据容器,包含一系列命名字段。每个字段必须是支持的数据类型之一。)solClient_opaqueContainer_ptIMapContainersolace.SDTMapContainer
流(一个结构化数据容器,包含一系列未命名字段。每个字段必须是支持的数据类型之一。)solClient_opaqueContainer_ptIStreamContainersolace.SDTStreamContainer
未知(格式正确但未识别的数据类型)solClient_uint8_tIUnknownSDTField使用 solace.SDTFieldType.UNKNOWN
空或未指定支持在结构化数据中为 NULL 数据执行添加和获取操作。按定义,NULL 没有对应的 “C” 类型或大小。nullnull

支持的结构化数据类型

结构化数据类型转换

下表列出了 JavaScript 和 Node.js API 如何读取接收到的消息中支持的 SDT。

读取为
Bool
------
写入为Bool
Byte
Byte[]
Char
Dest
Dbl
Float
Int
Long
Map
Msg
Short
Stream
String
1. 返回一个布尔值,其值由指定的字符串表示。如果字符串参数不为空,并且忽略大小写后等于字符串“true”,则返回的布尔值表示真值。
2. 如果转换无损。

JavaScript 和 Node.js 中可能的数据类型转换

下表列出了 C 和 .NET API 如何读取接收到的消息中支持的 SDT。

读取为
Bool
------
写入为Bool
Byte Array
Char
Dest
Dbl2
Float2
Integer2
String1
NULL5
1. 返回一个布尔值,其值由指定的字符串表示。如果字符串参数不为空,并且忽略大小写后等于字符串“true”或“1”,则返回的布尔值表示真值。
2. 如果整数字节非零,则返回布尔值 0 或 1。
3. 支持 8 位、16 位、32 位和 64 位有符号和无符号整数。只要转换不会导致信息丢失,客户端可以接收一种类型的整数并将其读取为另一种。
4. 使用 C API 时,如果字符串长度为 1,则 getChar() 返回字符串中的单个字符。
5. 任何字段都可以通过将其读取为 NULL 来跳过。

C 和 .NET 中可能的结构化数据类型转换