基于 Boost TCP 套接字的 C++ Avro 序列化

分享于2022年07月17日 avro boost c++ 问答
【问题标题】:C++ Avro Serialization over Boost TCP socket基于 Boost TCP 套接字的 C++ Avro 序列化
【发布时间】:2022-07-15 20:35:10
【问题描述】:

更新:所以我一直在做更多的挖掘工作。查看 Stream.cc 下的 GIT ,我看到 OuputStream 的数据结构实际上存储为 Vector,这是 boost 缓冲区想要看到的。但是,我似乎无法弄清楚如何访问 Vector。它在公共领域,但我似乎无法访问它。编译器告诉我该对象没有成员“data_”

原文:我有一个 boost asio TCP 套接字,我想通过它发送 Avro 序列化数据包。但是,我很难弄清楚如何做到这一点。 git 上的示例并未说明我如何通过套接字发送它,而且我无法找到发布示例的其他人。

我目前正在使用 CBOR 进行序列化,但需要切换到 Avro。

对于 CBOR,这相当容易。我取一个向量并将它与我要编码的 msg 一起传递给 cbor 编码器。

std::vector buffer;
jsoncons::cbor::encode_cbor(msg, buffer);
ws->write(boost::asio::buffer(buffer));

使用 git 中的示例,我已经能够获取我的 JSON 文件、加载架构、将数据添加到字段,然后将数据编码为 Avro 输出流。

抽奖是通过 boost::asio::write(sock, buffer) 发送数据包,我首先需要套接字,我很擅长,但缓冲区是我遇到的问题。如何获取输出流并将其转换为 boost::asio 认可的缓冲区?

std::ifstream ifile(filename);

avro::ValidSchema result;
avro::compileJsonSchema(ifile, result);
ifile.close();

std::unique_ptr out = avro::memoryOutputStream();
avro::EncoderPtr e = avro::binaryEncoder();
e->init(*out);
c::DCOP d1;

d1.collection = std::string("Collection -> ") + std::to_string(1);
d1.datatype = 2;
d1.value = 1;

avro::encode(*e, d1);

我知道 asio::buffer 有许多方法,它们将采用字符串、向量、原始内存或数组。我对 avro 的了解还不够,无法理解我可以用 outputstream 做什么

boost::asio::write(s, boost::asio::buffer(*?*));

  • 我不知道 AVRO,所以我不能给出完整的答案。但是 boost::asio::buffer 可以采用 void* 和 byteSize。如果你能得到第一个元素的指针和字节大小,你就设置好了。

【解决方案1】:

我也在寻找这个问题的答案。你搞清楚了吗?

【讨论】:

  • 佛法,请不要添加 Me too 作为答案。它实际上并没有提供问题的答案。如果你有一个不同但相关的问题,那么 ask 它(如果它有助于提供上下文,请参考这个问题)。如果您对这个特定问题感兴趣,您可以 upvote 它,留下 comment ,或者在您有足够的 reputation 时开始 bounty