首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发送大数据导致`DDS_OctetsPlugin_serialize:value长度不能大于分配大小`

发送大数据导致`DDS_OctetsPlugin_serialize:value长度不能大于分配大小`
EN

Stack Overflow用户
提问于 2020-11-06 14:43:49
回答 1查看 122关注 0票数 1

我的DDS写入器在写入小尺寸数据时工作正常。但是,当我使用DDS编写器发送大型数据时,我在运行时收到此错误。

代码语言:javascript
复制
DDS_OctetsPlugin_serialize:value length cannot be greater than alloc size
PRESWriterHistoryDriver_initializeSample:serialize sample error in topic 'xxxxx' with type 'DDS::Octets' and encapsulationId 1
WriterHistoryMemoryPlugin_addEntryToSession:!initialize sample
WriterHistoryMemoryPlugin_addEntryToSessions:!add entry to first session
WriterHistoryMemoryPlugin_getEntry:!add virtual sample to sessions
WriterHistoryMemoryPlugin_addSample:!get entry
PRESWriterHistoryDriver_addWrite:!add_sample in topic 'xxxxx'
PRESPsWriter_writeInternal:!collator addWrite
terminate called after throwing an instance of 'dds::core::Error'
  what():  
 DDS_OctetsPlugin_serialize:value length cannot be greater than alloc size
  PRESWriterHistoryDriver_initializeSample:serialize sample error in topic 'Pandar20P_BB_UdpPacketList' with type 'DDS::Octets' and encapsulationId 1
   WriterHistoryMemoryPlugin_addEntryToSession:!initialize sample
    WriterHistoryMemoryPlugin_addEntryToSessions:!add entry to first session
     WriterHistoryMemoryPlugin_getEntry:!add virtual sample to sessions
      WriterHistoryMemoryPlugin_addSample:!get entry
       PRESWriterHistoryDriver_addWrite:!add_sample in topic 'xxxxx'
        PRESPsWriter_writeInternal:!collator addWrite

以下是我的代码:

代码语言:javascript
复制
auto dp = dds::domain::DomainParticipant(1);
auto topic = dds::topic::Topic<dds::core::BytesTopicType>(dp, channelName);
auto qos = dds::core::QosProvider::Default().datawriter_qos();
writer = dds::pub::DataWriter<dds::core::BytesTopicType>(Publisher(dp), topic, qos, &writerListener); 
writer.write(data);

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-07 05:14:51

看起来您正在使用RTI的DDS,并且您为主题选择的类型是内置类型之一。Connext用户手册有一节3.2.7 Managing Memory for Built-in Types,它解释了中间件根据预定义的最大长度为数据样本预先分配了内存。默认情况下,对于您正在使用的八位字节类型,这是2048字节,并且您的序列似乎已经超过了这个长度。如手册中所述,您可以通过设置关联的QoS属性来增加该值。具体对于C++接口,您可以在Built-in types部分中找到相关说明。

在该部分的底部,用户手册还解释了在您事先不知道最大大小是多少的情况下应该如何处理。对于这种情况,可以通过将属性dds.builtin_type.*.alloc_size设置为32位有符号整数2,147,483,647的最大值,将内置类型配置为无边界。请注意,这可能会导致动态分配内存,这可能不是我们所希望的。

顺便问一下,您确定要使用BytesTopicType而不是KeyedBytesTopicType吗?在许多情况下,具有标识字节序列的键值是有益的。类型的键控版本允许您通过为它们提供不同的键值来同时维护它们中的几个的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64709966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档