关于C+的建议+;对象序列化技术 < >我正在创建C++对象序列化库。这更倾向于自我学习和增强&我不想使用像boost或googleprotocolbuf这样的现成库。 请分享您的经验或对好方法的评论(如使用标记值创建一些编码等)。 我想先支持POD,然后支持非线性DSs

关于C+的建议+;对象序列化技术 < >我正在创建C++对象序列化库。这更倾向于自我学习和增强&我不想使用像boost或googleprotocolbuf这样的现成库。 请分享您的经验或对好方法的评论(如使用标记值创建一些编码等)。 我想先支持POD,然后支持非线性DSs,c++,serialization,C++,Serialization,谢谢 PS:HNY2012几年前我写了一篇文章。代码和工具可能会过时,但概念可以保持不变 可能是可以帮助您的。如果您需要为进程间通信进行序列化,那么我建议使用一些接口语言(或)来定义接口 因此,支持其他语言(比C++更容易)。而且,实现代码/存根生成器也会更容易。过去几个月我一直在做类似的事情。我无法使用Boost,因为任务是序列化一组现有类(庞大的现有代码库),并且让这些类从具有serialize()虚拟函数的接口继承是不合适的(我们不希望多重继承) 所采取的方法具有以下显著特点: 为每个现有

谢谢
PS:HNY2012

几年前我写了一篇文章。代码和工具可能会过时,但概念可以保持不变


可能是可以帮助您的。

如果您需要为进程间通信进行序列化,那么我建议使用一些接口语言(或)来定义接口


因此,支持其他语言(比C++更容易)。而且,实现代码/存根生成器也会更容易。

过去几个月我一直在做类似的事情。我无法使用Boost,因为任务是序列化一组现有类(庞大的现有代码库),并且让这些类从具有serialize()虚拟函数的接口继承是不合适的(我们不希望多重继承)

所采取的方法具有以下显著特点:

  • 为每个现有类创建一个helper类,指定序列化该特定类的任务,并使helper类成为被序列化类的朋友。这避免了在被序列化的类中引入继承,还允许helper类访问私有变量
  • 让每个助手类(让我们称它们为“序列化器”)将自己注册到全局映射中。每个序列化程序类都实现一个clone()虚拟函数(“prototype”模式),该模式允许从该映射中检索指向序列化程序的指针(给定类的名称)。该名称是通过使用特定于编译器的RTTI信息获得的。全局映射的注册是通过实例化静态指针并“新建”它们来完成的,因为静态变量是在程序启动之前创建的
  • 创建了一个特殊的流对象(派生自
    std::fstream
    ),其中包含用于序列化非指针、指针和STL数据类型的模板函数。流对象只能在只读或只读模式下打开(根据设计),因此可以使用相同的serialize()函数从文件中读取或写入文件,具体取决于打开流的模式。因此,课堂成员的读写顺序不可能不匹配
  • 对于要保存或还原的每个对象,将根据变量的地址创建一个唯一的标记(整数),并将其存储在映射中。如果同一地址再次出现,则只保存标记,而不保存深度复制的对象本身。因此,每个对象只深度复制一次到文件中

  • 网站上的一个页面捕获了上面分享的一些想法:。希望能有所帮助。

    是的,我的目的是通过电线发送该对象。如果我使用IDL/ASN.1,那么我将不得不使用其相应的编译器(IDL编译器)来编码我的数据类型,这本质上将使用(BER/PER)等。我想定义自己的编码来打包数据并通过电线发送。谢谢@Emilio Garavaglia。我会仔细阅读你的文章以获得见解。当然,如果公共接口不足以序列化类,但不需要继承任何内容,则可能需要修改该类,使私有变量对
    serialize()
    函数可见。同意。然而,考虑到我们已经建立的复杂的层次结构,Boost太复杂了。从长远来看,手工完成的事情似乎更合适,更易于维护。谢谢Somesh,你的意见真的很有帮助。我正在浏览你提供的链接。我将使用序列化对象通过网络进行通信。本文还讨论了对非线性DS的支持(这很好)。我将有更多的讨论,一旦我与我的第一个原型:)