【问题标题】:C++ objects serialization for LinuxLinux 的 C++ 对象序列化
【发布时间】:2011-03-12 01:35:50
【问题描述】:

我正在做一个需要通过网络发送和接收数据的程序。我从来没有处理过对象序列化。我阅读了一些关于 Boost 和 Google Protocol Buffers 的建议。在 Linux 中使用哪个最好?

如果您知道其他人,我将感谢您的帮助。

谢谢。

【问题讨论】:

标签: c++ linux serialization


【解决方案1】:

如果您通过网络传输数据,我建议使用二进制形式的序列化(不是 XML 或类似形式)。 Qt offers classes for that,它允许您将 Qt 元系统已知的任何类传递到数据流中。

问题在于 C++ 并不真正支持将自省作为一种语言特性,因此您必须知道要序列化的数据。

在许多情况下,后跟数据的长度指示符(使用大端序)是序列化数据的好方法。

【讨论】:

    【解决方案2】:

    我使用Boost.Serialization 序列化对象并通过套接字传输它们。这是一个非常灵活的库,如果您可以访问对象,则可以对它们进行侵入式序列化

    class Foo
    {
    public:
        template<class Archive>
        void serialize(Archive& ar, const unsigned int version)
        {
            ar & _foo;
            ar & _bar;
        }
    
        int _foo;
        int _bar;
    };
    

    如果您无权访问需要序列化的对象,则非侵入式

    namespace boost {
    namespace serialization {
    
    template<class Archive>
    void serialize(Archive& ar, Foo& f, const unsigned int version)
    {
        ar & f._foo;
        ar & f._bar;
    }
    
    } // namespace serialization
    } // namespace boost
    

    如果 Foo 不暴露其成员(_foo_bar 此处),则有一些技巧可以序列化 Foo,documentation 很好地解释了这一点。要序列化 ​​Foo,请使用 boost::archive 命名空间中的对象:文本、二进制或 xml。

    std::stringstream ss;
    boost::archive::text_oarchive ar( ss );
    Foo foo;
    foo._foo = 1;
    foo._bar = 2;
    ar << foo;
    

    将存档重建为 Foo 对象是这样完成的

    boost::archive::text_iarchive ar( ss );
    Foo foo
    ar >> foo;
    

    请注意,这个示例相当简单,很明显,当您引入网络时,您将使用套接字和缓冲区。

    【讨论】:

    • 感谢您的帮助。我会试试的。
    • @Lucas,如果您对我们的其中一个回答感到满意,您应该接受它。
    猜你喜欢
    • 2011-05-25
    • 2012-09-12
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多