boost :: сериализация форматирование - PullRequest
1 голос
/ 24 марта 2012

Мне нужно использовать класс Matrix4x4 из какой-то сторонней библиотеки, и мне нужно его сериализовать.

1. Можно ли создать заголовок (3rdparty_serialization.h), который будет содержать всю сериализацию, необходимую для сторонних библиотек, например Matrix4x4:

namespace boost {
namespace serialization {

template<class Archive>
void serialize(Archive & ar, Matrix4x4 & m, const unsigned int version)
{
    for(size_t i = 0; i < 4;++i)
        for(size_t j = 0; j < 4;++j)
        {
            auto& e = m[i][j];
            ar & BOOST_SERIALIZATION_NVP(e);
        }
}

} // namespace serialization
} // namespace boost

2. Правильно ли это определение функции "сериализации" для Matrix4x4?

3. Как настроить форматирование сериализации Matrix4x4? Теперь у меня есть вывод:

<m class_id="2" tracking_level="0" version="0">
    <e>1</e>
    <e>0</e>
    <e>0</e>
    <e>0</e>
    <e>0</e>
    <e>1</e>
    <e>0</e>
    <e>0</e>
    <e>0</e>
    <e>0</e>
    <e>1</e>
    <e>0</e>
    <e>0</e>
    <e>0</e>
    <e>0</e>
    <e>1</e>
</m>

Я хочу что-то вроде этого:

<m class_id="2" tracking_level="0" version="0">
        <e>1;0;0;0</e>
        <e>0;1;0;0</e>
        <e>0;0;1;0</e>
        <e>0;0;0;1</e>
</m>

или другой более компактной и читаемой формы.

Ответы [ 2 ]

3 голосов
/ 25 марта 2012

Есть несколько способов сделать это. Самый простой способ - создать специальную версию serialize для xml_archive. Это предотвратит заражение других типов архивов. Попробуйте что-то вроде:

template<>
void save(boost::archive::xml_archive & ar, const Matrix4x4 & m, const unsigned int version)
{
    std::string e;
    for(size_t i = 0; i < 4;++i){
        for(size_t j = 0; j < 4;++j)
        {
            e +=  std::string(m[i][j]);
            e += ';';
        }
    }
    ar << BOOST_SERIALIZATION_NVP(e)
}

// similar for load

Роберт Рами

1 голос
/ 24 марта 2012

1. Да.

2. Да, при условии, что Matrix не входит в пространство имен.

3. Вы можете попробовать сериализовать std::string s вместо отдельных элементов.Однако это немного расточительно, так как вам нужно будет отформатировать и проанализировать строки.Также не оптимально для размера, если вы хотите использовать, например, binary_[io]archive.

...