代码之家  ›  专栏  ›  技术社区  ›  navigator

使用boost::serialization序列化为XML

  •  12
  • navigator  · 技术社区  · 14 年前

    这是个新手问题。我正试图将一些对象序列化为XML,但得到的XML包含一个我不需要的增强序列化签名、版本信息、类ID等等。有没有一种方法可以在不后期处理XML消息的情况下消除它们?

    #include <fstream>
    #include <iostream>
    #include <boost/archive/xml_iarchive.hpp>
    #include <boost/archive/xml_oarchive.hpp>
    
    using namespace std;
    
    class Test {
    private:    
        friend class boost::serialization::access;
        template<class Archive> void serialize(Archive & ar,
                const unsigned int version) {
            ar & BOOST_SERIALIZATION_NVP(a);
            ar & BOOST_SERIALIZATION_NVP(b);
            ar & BOOST_SERIALIZATION_NVP(c);
        }
    
        int a;
        int b;
        float c;
    public:
        inline Test(int a, int b, float c) {
            this->a = a;
            this->b = b;
            this->c = c;
        }
    };
    
    int main() {
        std::ofstream ofs("filename.xml");
    
        Test* test = new Test(1, 2, 3.3);
    
        boost::archive::xml_oarchive oa(ofs);
        oa << BOOST_SERIALIZATION_NVP(test);
    
        return 0;
    }
    

    结果:

      <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
      <!DOCTYPE boost_serialization (View Source for full doctype...)> 
      <boost_serialization signature="serialization::archive" version="6">
      <test class_id="0" tracking_level="1" version="0" object_id="_0">
        <a>1</a> 
        <b>2</b> 
        <c>3.3</c> 
      </test>
      </boost_serialization>
    

    不过,我将把这些消息序列化为字符串,并将它们发送到希望消息看起来像这样的系统。

      <test>
        <a>1</a>
        <b>2</b> 
        <c>3.3</c> 
      </test>
    

    有没有一种方法可以在没有签名的情况下序列化XML?

    2 回复  |  直到 6 年前
        1
  •  15
  •   stefan    12 年前

    无标题标志消除了标题行

    unsigned int flags = boost::archive::no_header;
    boost::archive::xml_oarchive oa(ofs, flags);
    

    以下宏消除了属性

    BOOST_CLASS_IMPLEMENTATION(Test, object_serializable)
    
        2
  •  1
  •   Ivo    14 年前

    那不是什么 boost::serialization 应该用于。如果要生成特定类型的XML,最好使用类似于 Xerces (是的,它到处都说“解析器”,但它也会编写XML)。