需要用于二进制流序列化的库,C ++

时间:2012-12-27 23:42:11

标签: c++ serialization deserialization

我正在寻找的内容类似于RakNet中内置的序列化库(我无法在当前项目中使用)。我需要能够在本地将二进制流保存/加载为自定义格式,并通过网络发送它们。网络部分已经解决,但我真的不想编写自己的方法来将所有不同类型的数据序列化为二进制文件,尤其是因为没有任何压缩方法它会效率低下。

这里有一些类似于RakNet的比特流工作的伪代码,这与我正在寻找的内容类似:

class Foo
{
public:
    void Foo::save(BitStream& out)
    {
        out->write(m_someInt);
        out->write(m_someBool);
        m_someBar.save(out);

        // Alternative syntax
        out->write<int>(m_someInt);

        // Also, you can define custom serialization for custom types so you can do this...
        out->write<Bar>(m_someBar);

        // Or this...
        out->write(m_someBar);     
    }

    void Foo::load(BitStream& in)
    {
        in->read(m_someInt);
        in->read(m_someBool);
        in->read(m_someBar);
    }

private:
    int m_someInt;
    bool m_someBool;
    Bar m_someBar;
};

是否有任何免费的C ++库允许这样的东西?我基本上只是希望将我的数据打包成二进制文件,并将其压缩以进行序列化,然后将其解压缩回二进制文件,我可以将其反馈到我的数据中。

编辑,添加更多信息:
不幸的是,Google Protocol Buffers或Boost Serialization都不能满足我的需求。两者都希望序列化对象成员,我需要简单地序列化数据。例如,假设我有一个std::vector<Person>,而类Person的名称和std::string都有Person,其中包含其他数据,但我只想对其名称进行序列化和反序列化。使用Google Protocol Buffers,它希望我将Person对象作为一个整体用于序列化。但是,我可以通过Boost Serialization实现这一点,但是如果我有另一个需要整个{{1}}序列化的场景,那么就没有办法做到这一点,你要么必须序列化所有这些,要么就是没有。基本上我需要相当多的灵活性来制作二进制流,但是我认为合适,我只是想要一个库来帮助我管理从流中读取和写入二进制数据,以及压缩/解压缩它。

1 个答案:

答案 0 :(得分:2)

  1. Google Protocol Buffers
  2. Boost serialization
  3. <强>更新

    查看更新后的问题我认为编写一个完全符合要求的小型自定义库可能是最简单的。我有一个类似的,它只有几百行代码(没有压缩)。为这种代码编写单元测试非常容易,因此从第一天开始它就是可靠的。

    为了序列化自定义类型,我有一个具有保存和加载方法的Persistent基类:

    class Storage {
    public:
      void writeInt( int i );
      void writeString( string s );
      int readInt();
      string readString();
    };
    
    class Persistent {
    public:
      virtual void save( Storage & storage ) = 0;
      virtual void load( Storage & storage ) = 0;
    };
    
    class Person : public Persistent {
    private:
      int height;
      string name;
    public:
      void save( Storage & storage ) {
        storage.writeInt( height );
        storage.writeString( name );
      }
    
      void load( Storage & storage ) {
        storage.readInt( height );
        storage.readString( name );
      }
    };
    

    然后在它上面有一个简单的图层,它在保存时存储一些类型信息,并在加载时使用Factory创建新对象。

    这可以通过使用C ++的流(我不太喜欢,因此是Storage类)进一步简化。或者复制Boost使用&amp;的方法运算符合并加载并保存到单个方法中。