FlatBuffers:使用联盟发送多个数据包类型

时间:2016-06-07 16:50:07

标签: c# c++ flatbuffers

我将通过连接发送多种缓冲区类型。为了简单起见,想象一下如下的模式:

namespace MyEvents;  

table EventOne  
{  
  id:uint;  
  timestamp:ulong;  
  adress:string;  
}  

table EventTwo  
{  
  id:uint;  
  timestamp:ulong; 
  strength:float;   
}  

union Events {EventOne, EventTwo}  

table EventHolder  
{  
  theEvent:Events;  
}  

root_type EventHolder;  

我为C ++和C#生成了所需的文件,并在我各自的项目中根据需要包含它们。

以下是我在C ++中编码事件的方法 - 这里是EventOne类型的事件:

...  
uint32_t anId(645);  
uint64_t aTimestamp(1234567);  
string anAddress("00::00::45::56::47::e5");  

flatbuffers::FlatBufferBuilder builder;  
auto addressOffset= builder.CreateString(anAddress);  
auto eventOneOffset= MyEvents::CreateEventOne(builder, anId, aTimestamp, addressOfset);   

// Here is where I am confused - how to create the EventHolder object.  
// Original code I posted about - commented out, but has error.
//auto eventHolderOffset= MyEvents::CreateEventHolder(builder, MyEvents::Events_EventOne, eventOneOffset);  // Compile error here.  

auto eventHolderOffset= MyEvents::CreateEventHolder(builder, MyEvents::Events_EventOne, eventOneOffset.Union());  // No compile error here.  

builder.Finish(eventHolderOffset);  

// Access buffer pointer and size and send it on its way.  

请注意,我在创建EventHolder对象时遇到问题:我有一个类型为FlatBuffers :: Offset< MyEvents :: EventOne>的偏移量。但CreateEventHolder函数采用FlatBuffers :: Offset< void>类型的偏移量。

  • 此过程(包含union类型的对象的表)是使用flatbuffers发送多个数据包类型的正确方法吗?编辑:答案似乎是“是”
  • 我错过了活动的内外编码步骤吗?编辑:不!它很棒。
  • 如果此过程正确,我需要做些什么来避免类型冲突?编辑:像Aardappel说的那样,从Flatbuffers encoding then decoding C++ double array + table + union returns junk开始,我只需要将.Union()添加到偏移量参数中。

任何帮助将不胜感激。 FWIW,我在C ++中进行编码,并在那里进行测试解码,但是通过UDP将数据发送到C#应用程序以在那里进行最终解码。为此,我对数据包进行了类型测试并进行相应的解释。

更新:我找到了一个例子,看到我需要在CreateEventHolder中将Union函数添加到偏移的末尾。我现在可能很高兴。

1 个答案:

答案 0 :(得分:2)

尝试使用eventOneOffset.Union()获取该偏移量的无类型版本。也许这没有记录得足够好。