2010-08-11 4 views
12

Это вопрос новичков. Я пытаюсь сериализовать некоторые объекты в XML, но полученный XML содержит сигнатуру с расширением сериализации, информацию о версии, идентификатор класса и т. Д. что мне не нужно. Есть ли способ избавиться от них без постобработки xml-сообщения?Сериализация в XML с использованием boost :: serialization

#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 без подписи?

ответ

1

Это не то, что должно быть boost::serialization. Если вы хотите создать определенный тип XML, лучше используйте генератор XML, например, Xerces (да, он говорит «парсер» везде, но он также будет писать XML).

+0

ли вы знаете пример использования Xerces для создания типа вывода @navigator хочет? – Jeff

+1

Почему вы говорите, что это не предполагаемое использование? Документы [не согласны с вами] (http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/index.html): «Эта библиотека будет полезна в других контекстах помимо реализации персистентности , Наиболее очевидным случаем является сортировка данных для передачи в другую систему. –

15

флаг no_header устраняет строки заголовка

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

следующий макрос удаляет атрибуты

BOOST_CLASS_IMPLEMENTATION(Test, object_serializable)