在奇妙的 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/