【问题标题】:How to implement a C++ serializer the idiomatic way?如何以惯用的方式实现 C++ 序列化程序?
【发布时间】:2013-05-05 07:35:36
【问题描述】:

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

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

【问题讨论】:

    标签: c++ json serialization boost stl


    【解决方案1】:

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

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

    然而,这种方法需要在 C++ 中进行某种形式的类型自省,结果证明这比序列化本身要复杂得多。这是我写的一篇关于这个主题的文章: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 );
    

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

    【讨论】:

    • 感谢您的回答 - 我更新了我的问题,这太笼统了。
    • @gracchus 我明白了。好吧,我对此的回应是做任何你喜欢的事情。通常,模板化的POD 序列化程序可以工作,只要流或文件对象支持所有必需的基本类型的重载。我自己喜欢fprintf,所以我专门化了我所有的基本例程。我尝试稍微更新我的答案以更好地回答您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多