c++ - 如何以惯用的方式实现 C++ 序列化程序?

标签 c++ json serialization boost stl

作为练习,我正在实现 UBJson多种语言的序列化器。我的问题是:是否有一种惯用的方法可以在 C++ 中实现自定义格式的读取器和写入器?例如,我想实现另一种 boost::serialization 存档类型。

更多细节:类型内省(introspection)部分不是问题 - 如果我曾经使用我的实现,它会替换已经存在的 json 序列化程序。我也理解递归序列化的概念。真正的问题是:我应该创建 readInt 和 writeString 方法,还是只创建两个模板化的读写方法,或者...?

最佳答案

嗯,我不知道有什么惯用的方法,尽管我知道的标准策略是只序列化最简单的类型。可以递归地将复杂对象分解为更简单的部分,直到基本 POD 类型,例如 intchar *float 被发现。然后为这些基本类型创建手工序列化例程。

更复杂类型的序列化涉及这种递归类型自省(introspection),这会导致从较小的序列化例程构建更大的序列化例程。

然而,这种方法需要在 C++ 中进行某种形式的类型自省(introspection),事实证明这比序列化本身要复杂得多。这是我写的一篇关于该主题的文章:http://www.randygaul.net/2013/01/05/c-reflection-part-5-automated-serialization/

有两种主要的方法来编写实际的序列化例程。第一种方法是创建一个单一的序列化函数,该函数采用 bool 作为输入/输出。

void Serialize( type instance, bool input );

第二种方法是将输入和输出写成单独的函数(我自己更喜欢):

void Serialize( type instance );
Variant Deserialize( type info );

模板化序列化例程,或仅提供特定重载是一个偏好问题。

关于c++ - 如何以惯用的方式实现 C++ 序列化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16485280/

相关文章:

serialization - 如何序列化图结构?

C++ 传递对象的拷贝还是传递指向对象的指针?

c++ - 是否有用于多线程内存分配器的验证套件?

c# - 合并不同语言的程序

javascript - 使用 Web API Get() 正确格式化 JSON

c# - ServiceStack.Text json 反序列化创建错误的对象而不是抛出无效的 json 输入字符串

java - 为什么 break 不结束 while 循环?

python - 使用 Python 转换为 JSON 的对象列表

c# - 在接口(interface)中定义序列化数据成员,然后在实现所述接口(interface)的类中使用它

c++ - 为什么括号在初始化空 vector 时会有所不同?