C++ 序列化使用哪种分隔符?

C++ 序列化使用哪种分隔符?,c++,string,serialization,C++,String,Serialization,我正在建造一个ostringstream 我正在向这个流中写入ints 我正在使用stream如果发送二进制数据,您将不使用/不需要“分隔符”。您将知道每种大小需要写入和读取多少字节。例如,如果您的数字类型为uint32\t,则这些数字将是流中的四个字节 但我从您的编辑中看到,您需要一些机制来反序列化更复杂的数据结构。我建议对此使用一些更合适的协议,例如…有几个问题。最直接的是你是 输出固定长度的二进制数据,但尝试将其作为 输入上的可变长度(部分)文本数据。典型的 二进制浮点将具有固定长度(但取

我正在建造一个ostringstream

我正在向这个流中写入
int
s


我正在使用
stream如果发送二进制数据,您将不使用/不需要“分隔符”。您将知道每种大小需要写入和读取多少字节。例如,如果您的数字类型为
uint32\t
,则这些数字将是流中的四个字节


但我从您的编辑中看到,您需要一些机制来反序列化更复杂的数据结构。我建议对此使用一些更合适的协议,例如…

有几个问题。最直接的是你是 输出固定长度的二进制数据,但尝试将其作为 输入上的可变长度(部分)文本数据。典型的 二进制浮点将具有固定长度(但取决于 关于二进制格式,我知道有例外)。二元的 积分数据通常也有固定的长度,但是 可变长度并不罕见(例如谷歌的协议块)

第二个,也是更普遍的问题是,你只是在倾销 位到输出流,无任何格式。也就是说 在将来的某个时候,你几乎肯定不能 重读一遍。如果您正在将数据泄漏到 磁盘,因为它无法装入内存,而且数据只会 稍后用相同的过程重新读取。否则,您将需要 定义一种格式,并根据其内容输出(和输入) 定义。(为什么
istream::read

ostream::write
take
char*
,而不是
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);
}