Linux - > C ++代码:对象序列化

时间:2010-12-14 21:10:53

标签: c++ xml serialization

我应该将哪个库用于作为.net webservice输入的对象序列化(意味着此web服务需要在其输入中使用xml)?

作为进一步的问题:

如果使用Non Intrusive Version(引导序列化),在xml文件中写入时,究竟是什么代码? (oa<<?)。我尝试了一些解决方案,但似乎我有错误。我实际上不能说oa<< g.

以下是代码:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <dlfcn.h>
#include <iostream>
#include <fstream>

class gps_position
{
public:
    int degrees;
    int minutes;
    float seconds;
    gps_position(){};
};

namespace boost { namespace serialization {

    template<class Archive>
    void serialize(Archive & ar, gps_position & g, const unsigned int version)
    {
        ar & g.degrees;
        ar & g.minutes;
        ar & g.seconds;
    }    

} } // namespace boost::serialization

// gps_position g;

int main() {

    gps_position obj;
    std::ofstream ofs("filename2.xml");

    if(ofs.good()) {
        //const gps_position g;

        try {
            boost::archive::xml_oarchive oa(ofs);

            // what to write in the xml?
            oa << ??????????????????;

        } catch(boost::archive::archive_exception& ex) {

        }
    } 
    return 0;
}

3 个答案:

答案 0 :(得分:3)

Boost Serialization会将C ++对象序列化为XML流。我不知道它是否会自动与您的网络服务兼容。

回答评论: 这是一个例子:

#include <boost/serialization/vector.hpp> 
#include <boost/archive/xml_oarchive.hpp> 
#include <fstream>

class myclass
{
    //...
private: 
    int var1;
    double var2;
    std::vector<int> var3;

    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(var1);
        ar & BOOST_SERIALIZATION_NVP(var2);
        ar & BOOST_SERIALIZATION_NVP(var3); 
    }
};

//...

myclass myobject;

//...

ofstream ofs("filename.xml");
if(ofs.good()) {
    try {
        boost::archive::xml_oarchive oa(ofs);
        oa << BOOST_SERIALIZATION_NVP(myobject);
    }catch(boost::archive::archive_exception& ex){
        //...
    }
} 

基本上在课堂上你需要让boost::serialization::access成为朋友并提供成员函数serialize。这里播放一些技巧,重载&运算符,以便在不同方向上充当流操作符,具体取决于您是保存还是加载。对于大多数类,只需按照这种模式对所有成员变量进行操作,不要担心实际发生的事情(如果你想知道,请阅读文档)。

要实际序列化对象,只需将其流式传输到xml_oarchive对象,该对象可以实例化以写入任何ostream对象。

答案 1 :(得分:0)

如果您有兴趣,那么您可以查看Google提供的协议缓冲区。文档也相当不错: Here

它的性能远远优于XML。

答案 2 :(得分:0)

如何编译有关Boost序列化的示例?

g++ example.cpp -o example++

返回了很多错误(在Linux上:Ubuntu 10.10)

我找到了结果:

g++ example.cpp -lboost_serialization