/ / boost :: formatowanie serializacji - c ++, serializacja, boost

boost :: formatowanie serializacji - c ++, serializacja, boost

Muszę użyć klasy Matrix4x4 z biblioteki innej firmy i muszę ją serializować.

1. Czy można utworzyć nagłówek (3rdparty_serialization.h), który będzie zawierał całą serializację potrzebną do bibliotek stron trzecich, takich jak 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. Czy ta definicja funkcji „serializuj” dla Matrix4x4 jest poprawna?

3. Jak dostosować formatowanie serializacji Matrix4x4? Teraz mam wyjście:

<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>

Chcę coś takiego:

<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>

lub inna bardziej zwarta i czytelna forma.

Odpowiedzi:

1 dla odpowiedzi № 1

1. Tak.

2. Tak, zakładając Matrix nie znajduje się w przestrzeni nazw.

3. Możesz spróbować serializować std::strings zamiast poszczególnych elementów. Jest to jednak trochę marnotrawstwo, ponieważ będziesz musiał sformatować i parsować ciągi. Nie jest również optymalny dla rozmiaru, jeśli chcesz użyć np. binary_[io]archive.


3 dla odpowiedzi № 2

Można to zrobić na kilka sposobów. Najprostszym sposobem byłoby wykonanie specjalnej weryfikacji serializacji dla xml_archive. To powstrzymałoby zmianę od infekowania innych typów archiwów. Wypróbuj coś takiego:

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

Robert Ramey