1

我正在寻找的是类似于 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::stringfor 名称,以及其中的其他数据,但我只想序列化和反序列化它们的名称。使用 Google 协议缓冲区,它希望我将 Person 对象作为一个整体提供给它以进行序列化。但是,我可以通过 Boost 序列化来实现,但是如果我有另一个需要整个Person要序列化,没有办法做到这一点,您要么必须序列化所有序列,要么不序列化。基本上我需要相当多的灵活性来制作二进制流,但是我认为合适,我只想要一个库来帮助我管理从流中读取和写入二进制数据,以及压缩/解压缩它。

4

1 回答 1

2
  1. Google 协议缓冲区
  2. 提升序列化

更新

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

为了序列化自定义类型,我有一个 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 );
  }
};

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

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

于 2012-12-27T23:45:53.153 回答