Sec*_*ret 2 c c++ binary implementation serialization
我想自己实现二进制序列化,而不使用Boost或任何其他第三方库.
在C++中,实现它的最简单方法是使用ofstream然后通过网络发送二进制文件.但是有没有其他流类可以用作临时缓冲区以避免将文件写入磁盘?
另外,我怎样才能在纯C中实现这一目标?
Bal*_*arq 14
坚持是一个难题.即使将对象序列化到磁盘也不是一件容易的事.比方说,你在C中有这样的结构:
struct Person {
char name[100];
int year;
};
Run Code Online (Sandbox Code Playgroud)
这是一个包含sef的结构,可能是真正应用序列化的最简单方法.但是,您将不得不面对以下问题:
编译器的填充系统.在内存中完成结构以便在内存中占用大量单词的方法并不标准.
操作系统和机器本身以二进制形式表示数据的方式.显然,这种表示从一台机器变为另一台机器.
结论是,即使是同一个程序在同一操作系统中创建的文件也可能与同一操作系统中的同一程序不兼容,因为这两个程序可能都是用不同的C编译器编译的.
现在让我们看看C++中的一个对象:
class Person {
public:
// more things...
private:
string name;
Date * birth;
Firm * firm;
};
Run Code Online (Sandbox Code Playgroud)
现在,同样的事情变得非常复杂.对象不再是自包含的,你应该按照指针来决定如何处理每个对象(这称为3.指针调配和传递持久性).你仍然有1)和2)问题.
因此,假设您专注于自包含对象,并且仍然需要针对点1和2的解决方案.唯一的方法是以a)文本格式或b)字节码格式决定表示.字节码格式可以被任何操作系统中的任何程序理解,使用任何C编译器编译,因为信息是逐字节读取和写入的.这是Java或C#序列化其对象的方式.作为表示的文本格式与字节码一样有效,但速度较慢.它的主要优点是它可以被人类和计算机理解(结构化文本格式可以是XML).
因此,为了序列化自包含对象,无论选择何种输出格式,您都需要具有能够读取整数,字符,字符串等的基本函数(或C++中的类).当你拥有每一对的写/读对时,你必须为程序员提供为她的对象创建自己的写/读对的可能性,使用你对元素数据的读/写对.
我们在这里谈论一个完整的框架,就像Python提供的pickle模块一样.
最后,能够缓存序列化而不是将其保存到磁盘的事实是您遇到的最少问题.ostringstream如果使用基于文本的格式,则可以使用该类;如果使用字节码,则可以使用内存块.
如您所见,这不是一项简单的工作.希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
8971 次 |
| 最近记录: |