gpt4 book ai didi

c++ - 纯 C/C++ 中的二进制序列化

转载 作者:太空狗 更新时间:2023-10-29 23:36:59 27 4
gpt4 key购买 nike

我想自己实现二进制序列化,而不使用 Boost 或任何其他第三方库。

在 C++ 中,实现它的最简单方法是使用 ofstream 然后通过网络发送一个二进制文件。但是是否有任何其他流类可以用作临时缓冲区以避免将文件写入磁盘?

另外,我怎样才能在纯 C 中实现它?

最佳答案

坚持是个难题。甚至将一个对象序列化到磁盘也不是一件容易的事。比如说,你在 C 中有这样一个结构:

struct Person {
char name[100];
int year;
};

这是一个自包含结构,可能是真正应用序列化的最简单方法。但是,您将不得不面对以下问题:

  1. 编译器的填充系统。在内存中完成一个结构使其占用内存中所有单词的方式并不标准。

  2. 操作系统和机器本身以二进制形式表示数据的方式。显然,这种表示从一台机器到另一台机器会发生变化。

结论是,即使由同一操作系统中的同一程序创建的文件也可能与同一操作系统中的同一程序不兼容,因为可能这两个程序是使用不同的 C 编译器编译的。

现在让我们看看 C++ 中的一个对象:

class Person {
public:
// more things...

private:
string name;
Date * birth;
Firm * firm;
};

现在同样的事情变得非常复杂。对象不再是自包含的,你应该按照指针来决定如何处理每个对象(这称为 3. 指针调配和传递持久性)。你仍然有 1) 和 2) 问题。

所以假设您专注于自包含对象,并且仍然需要第 1 点和第 2 点的解决方案。唯一的方法是决定 a) 文本格式或 b) 字节码格式的表示。字节码格式可以被任何操作系统中的任何程序理解,用任何 C 编译器编译,因为信息是逐字节读取和写入的。这是 Java 或 C# 序列化其对象的方式。作为表示的文本格式与字节码一样有效,但速度较慢。它的主要优点是它可以被人和计算机理解(结构化文本格式可以是 XML)。

因此,为了序列化您的自包含对象,无论选择何种输出格式,您都需要具有能够读取整数、字符、字符串等的基本函数(或 C++ 中的类)。当您拥有每个对象的写/读对时,您必须为程序员提供为她的对象创建她自己的写/读对的可能性,使用您的读/写对来处理基本数据。

我们在这里讨论的是一个完整的框架,类似于 Python 提供的 pickle 模块。

最后,能够缓存您的序列化而不是将其保存到磁盘这一事实是您最不关心的问题。如果您使用基于文本的格式,则可以使用 ostringstream 类;如果您使用字节码,则可以使用内存块。

如您所见,这不是一项简单的工作。希望这会有所帮助。

关于c++ - 纯 C/C++ 中的二进制序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11003246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com