2012-03-24 70 views
1

我必须从某个第三方库中使用Matrix4x4类,并且需要序列化它。boost ::序列化格式

它是确定创建头(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> 

或其他更紧凑和可读的形式。

回答

1

1.是的。

2.是的,假设Matrix不在名称空间内。

3.您可以尝试序列化std::string而不是单个元素。但是,这有点浪费,因为您需要格式化和解析字符串。如果您想要使用例如尺寸,也不是最佳尺寸。 binary_[io]archive

+0

我认为应该有某种属性等 – innochenti 2012-03-24 19:26:40

+0

加速系列化主要是存档类型无关。属性是XML的唯一东西,但也有标准的文本和二进制档案,更不用说你原则上也可以写自己的。您已经必须创建这些名称 - 值对,其名称部分不用于文本或二进制文件。为XML增加更多的复杂性可能被认为太多了。 – doublep 2012-03-24 21:07:41

+0

我不认为这些属性会影响档案的类型。对于二进制存档,我们可以轻松跳过这些属性 – innochenti 2012-03-25 18:07:23

3

有几种方法可以做到这一点。最简单的方法是为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 

罗伯特·雷米

+0

谢谢你的回答! – innochenti 2012-03-25 19:21:34