【发布时间】: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<uint8_t> 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<avro::OutputStream> 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。如果你能得到第一个元素的指针和字节大小,你就设置好了。