c++ - 在 C++ 中寻找 MemoryStream

标签 c++ boost stl stream buffer

在奇妙的 C# 世界中,我可以创建内存流而不指定其大小, 写入其中,然后只获取底层缓冲区。

我如何在 C++ 中做同样的事情?基本上我需要做的:

memory_stream  ms(GROW_AS_MUCH_AS_YOU_LIKE);

ms << someLargeObjects << someSmallObjects << someObjectsWhosSizeIDontKnow;

unsigned char* buffer = ms.GetBuffer();
int bufferSize = ms.GetBufferSize();

rawNetworkSocket.Send(buffer, bufferSize);

顺便说一下,虽然我对它不是很熟悉,但我的项目得到了 boost 。

谢谢。

最佳答案

#include <sstream>

std::ostringstream  buffer; // no growth specification necessary
buffer << "a char buffer" << customObject << someOtherObject;

std::string contents = buffer.str();
size_t bufferSize = contents.size();

rawNetworkSocket.Send(contents); // you can take the size in Send

使用这种方法,您必须在收到结果的地方解析结果(因为上面的代码只是将您的数据转换为非结构化字符串。

另一个问题是,由于 C++ 不支持反射,您必须为对象定义运算符 <<。这是 Custom 类的代码:

template<typename C, typename T>
std::basic_ostream<C,T>& operator << (
    std::basic_ostream<C,T>& out, const Custom& object)
{
    out << object.member1 << "," << object.member2 /* ... */ << object.memberN;
    return out;
}

如果你想要结构化序列化,看看boost::serialization .

关于c++ - 在 C++ 中寻找 MemoryStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3091152/

相关文章:

c++ - boost::hash包含元组的元组

C++,将 vector<char> 写入 ofstream 会跳过空格

c++ - N 位环绕的整数减法

c++ - 在cmake中,如何以可伸缩的方式指定子目录的依赖关系?

c++ - 从抽象类 C++ 继承对象的数组

c++ - Boost asio run vs work(歧义)——工作类的目的是什么?

c++ - Trie 结束于当前节点或之后的节点

boost - 记录 Boost.Test 测试用例

C++ STL 列表崩溃,数字超过 1 000 000 000

充满抽象对象的 C++ 容器