我希望自己实现二进制序列化,而不使用Boost
或其他第三方库。
C++中最简单的方法是使用ofstream
,然后通过网络发送二进制文件。但是否有其他流类可以用作临时缓冲区以避免将文件写入磁盘?
此外,在纯C中如何实现这一点?
我希望自己实现二进制序列化,而不使用Boost
或其他第三方库。
C++中最简单的方法是使用ofstream
,然后通过网络发送二进制文件。但是否有其他流类可以用作临时缓冲区以避免将文件写入磁盘?
此外,在纯C中如何实现这一点?
持久化是一个难题。即使将对象序列化到磁盘上也不是一件简单的事情。假设你有一个C语言中的结构体如下:
struct Person {
char name[100];
int year;
};
这是一个自包含结构体,可能是实现序列化最简单的方式。然而,你将面临以下问题:
编译器的填充系统。为了使一个结构在内存中占用整数个字,完成结构的方式是不标准的。
操作系统和计算机本身以二进制形式表示数据的方式。显然,这种表示方法因计算机而异。
由此得出的结论是,即使是在同一操作系统中相同的程序创建的文件,在同一操作系统中使用相同的程序也可能不兼容,这是因为两个程序可能使用了不同的C编译器。
现在让我们来看一个C++对象:
class Person {
public:
// more things...
private:
string name;
Date * birth;
Firm * firm;
};
现在同样的事情变得非常复杂了。对象不再是自包含的,你需要跟随指针来决定如何处理每个对象(这被称为3.指针扫描和传递性持久化)。而且你仍然有第1和第2个问题。我一直在使用JSON来序列化数据。它很简单,这是一个非常好的事情。很容易正确地使用JSON,并且很容易发现任何问题。
虽然它不像其他格式那样节省空间,但对于许多目的来说已经足够了。而且你可以从JSON网站获取免费的库代码。
binn *obj;
// create a new object
obj = binn_object();
// add values to it
binn_object_set_int32(obj, "id", 123);
binn_object_set_str(obj, "name", "John");
binn_object_set_double(obj, "total", 2.55);
// send over the network or save to a file...
send(sock, binn_ptr(obj), binn_size(obj));
// release the buffer
binn_free(obj);
object o;
socket.write(&o, sizeof(o));
std::stringstream
? - Florian Sowadestd::ostream
可以用作缓冲区。 - AJG85