C++ 序列化使用哪种分隔符?
我正在建造一个ostringstream 我正在向这个流中写入C++ 序列化使用哪种分隔符?,c++,string,serialization,C++,String,Serialization,我正在建造一个ostringstream 我正在向这个流中写入ints 我正在使用stream如果发送二进制数据,您将不使用/不需要“分隔符”。您将知道每种大小需要写入和读取多少字节。例如,如果您的数字类型为uint32\t,则这些数字将是流中的四个字节 但我从您的编辑中看到,您需要一些机制来反序列化更复杂的数据结构。我建议对此使用一些更合适的协议,例如…有几个问题。最直接的是你是 输出固定长度的二进制数据,但尝试将其作为 输入上的可变长度(部分)文本数据。典型的 二进制浮点将具有固定长度(但取
int
s
我正在使用
stream如果发送二进制数据,您将不使用/不需要“分隔符”。您将知道每种大小需要写入和读取多少字节。例如,如果您的数字类型为uint32\t
,则这些数字将是流中的四个字节
但我从您的编辑中看到,您需要一些机制来反序列化更复杂的数据结构。我建议对此使用一些更合适的协议,例如…有几个问题。最直接的是你是
输出固定长度的二进制数据,但尝试将其作为
输入上的可变长度(部分)文本数据。典型的
二进制浮点将具有固定长度(但取决于
关于二进制格式,我知道有例外)。二元的
积分数据通常也有固定的长度,但是
可变长度并不罕见(例如谷歌的协议块)
第二个,也是更普遍的问题是,你只是在倾销
位到输出流,无任何格式。也就是说
在将来的某个时候,你几乎肯定不能
重读一遍。如果您正在将数据泄漏到
磁盘,因为它无法装入内存,而且数据只会
稍后用相同的过程重新读取。否则,您将需要
定义一种格式,并根据其内容输出(和输入)
定义。(为什么istream::read
和
ostream::write
takechar*
,而不是void*
)使用定义良好的格式和标准解析器。例如,json
,csv
,等等。二进制数据不需要任何分隔符。double总是有相同的长度,不管数字是多少。请检查编辑为什么要将它们作为字符串发送?你不能把它们作为字节发送吗?这样,您就知道前4个字节属于第一个数字,后4个字节属于第二个数字。不需要做任何事。您只需确保4字节整数。编辑:ups没有意识到你的意思是双重的(仍然是相同的概念)。如果你传输二进制数据,你不能使用在另一端空间分割的东西。解析器需要能够计算字节数并重新组装传输的数据。这是一个很好的建议。在此之前,总是有XDR(和BER,以及其他一些):如果您自己实现它,XDR可能是最简单的。@JamesKanze OT:THX James。我能从一些古老的C++新闻组中记住你的名字吗?我是<代码> COMP.L.C.+的创建者之一。主持了<代码> > COMP.L.C++<代码>,<代码> Fr.C.P.L.C.+/<代码>和<代码> DE.COMP.Lang.ISO-C++</代码>。新闻组的格式远远优于我们这里的格式,但它们似乎正在被放弃。
std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
split(s, delim, elems);
return elems;
}
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
void insert_into_stream(std::ostream& stream, const cMatrix3d rot)
{
cVector3d column;
unsigned int byteCounter = 0;
int length = sizeof(double)*3;
char insert_buffer[sizeof(double)*9];
column = rot.getCol0();
memcpy(insert_buffer, &column[0], length);
stream.write(insert_buffer, length);
byteCounter += length;
column = rot.getCol1();
memcpy(insert_buffer+byteCounter, &column[0], length);
stream.write(insert_buffer, length);
byteCounter += length;
column = rot.getCol2();
memcpy(insert_buffer+byteCounter, &column[0], length);
stream.write(insert_buffer, length);
}