2012-03-24 8 views
1

私はいくつかのサードパーティライブラリからMatrix4x4クラスを使用しなければならず、それを直列化する必要があります。boost :: serialization formatting

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 

は、この定義です:

1.

はそれがOK Matrix4x4のようなサードパーティのライブラリのために必要とされるすべてのシリアライズを、含まれていますヘッダ(3rdparty_serialization.h)を作成することですMatrix4x4の "シリアライズ"機能は正しいですか?

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

はい。

2.はい、Matrixが名前空間内にないとします。

3.個々の要素の代わりにstd::stringをシリアル化することができます。ただし、文字列を書式設定して解析する必要があるため、これは少し無駄です。また、たとえばサイズを使用したい場合は最適ではありません。 binary_[io]archive

+0

私は属性のいくつかの種類があるはずと信じてなど – innochenti

+0

ブーストのシリアル化はとらわれない、ほとんどのアーカイブタイプです:のようなものを試してみてください。属性はXMLのためだけのものですが、標準的なテキストとバイナリのアーカイブもありますが、原則としてあなた自身も書くことができます。これらの名前と値のペアを作成する必要があります。名前と値のペアは、テキストやバイナリでは使用されません。 XMLのためにさらに複雑さを加えることは、あまりにも多すぎると考えられていました。 – doublep

+0

私はその属性がアーカイブのタイプに影響するとは思わない。バイナリアーカイブの場合、これらの属性を簡単にスキップできます。 – innochenti

3

これを行うにはいくつかの方法があります。最も簡単な方法は、xml_archiveのためのserializeの特別な検証を行うことです。これにより、変更が他のアーカイブタイプを感染させないようにします。

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

関連する問題