【问题标题】:Linux -> C++ code : Object SerializationLinux -> C++ 代码:对象序列化
【发布时间】:2011-05-25 13:30:21
【问题描述】:

对于作为 .net Web 服务输入的对象序列化,我应该使用什么库(这意味着该 Web 服务需要在其输入中使用 xml)?

作为另一个问题:

如果使用非侵入式版本(引导序列化),在写入 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;
}

【问题讨论】:

  • @mely 为您的问题使用适当的标签:您的问题被标记得越好,被看到的机会就越大。
  • 您确定只需要序列化而不是完整的 C++ SOAP 工具包吗?
  • @mely:生成“一个 xml”是不够的。它必须符合 web 服务期望的任何格式(很可能是某种 SOAP)
  • @mely - 只是一个友好的建议:请不要使用答案来询问有关您要解决的问题的更多问题。而是更新您的问题或在评论中询问您需要一些小的说明。这样做会导致您失去声誉,因为这被视为糟糕的网站礼仪。

标签: c++ xml serialization


【解决方案1】:

我如何编译您的关于 Boost 序列化的示例?

g++ example.cpp -o example++

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

我找到了结果:

g++ example.cpp -lboost_serialization

【讨论】:

  • g++ -I -c example.cpp

    g++ -L -lboost_filesystem -o example.o

  • 另外你必须考虑将你的 boost lib 的路径添加到 LD_LIBRARY_PATH / LD_LIBRARY_PATH64 (for 32bit/64bit arch) 环境变量中
  • thx..那么非侵入式版本呢?主要如何在xml文件中添加元素?我的代码的一个例子是上面写的 gps_position 。祝你有美好的一天
【解决方案2】:

如果你有兴趣,那么你可以看看谷歌的协议缓冲区。该文档也同样适用: Here

而且它的性能比 XML 好很多。

【讨论】:

    【解决方案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。这里使用了一些技巧,通过重载&amp; 运算符来充当不同方向的流运算符,具体取决于您是保存还是加载。对于大多数类,尽管对所有成员变量都遵循此模式,但不必担心实际发生了什么(如果您想知道,请阅读文档)。

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

    【讨论】:

    • 你能给我一个简短的例子吗?如果我有:
    • MyClass{ std::string name;诠释我; } *cls;
    • 我将如何序列化例如 cls->name = "monday";
    猜你喜欢
    • 2011-03-12
    • 2011-08-13
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2012-09-12
    • 2019-12-16
    • 1970-01-01
    相关资源
    最近更新 更多