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 № 11. Tak.
2. Tak, zakładając Matrix
nie znajduje się w przestrzeni nazw.
3. Możesz spróbować serializować std::string
s 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