2012-03-24 66 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