Ist es möglich, eine boost::ptr_vector
Instanz mit Müsli zu serialisieren? Wenn das so ist, wie?Wie boost :: ptr_vector mit Getreide zu serialisieren?
Antwort
Es ist definitiv möglich. Sie können auf dem Archiv und Zeigertyp wie diese externen save()
und load()
Template-Funktionen erstellen:
#include <iostream>
#include <sstream>
#include <boost/ptr_container/ptr_vector.hpp>
#include <cereal/archives/binary.hpp>
#include <cereal/types/string.hpp>
// Sample serializable object.
struct MyRecord {
std::string s_;
MyRecord(const std::string s = std::string())
: s_(s) {
}
template <class Archive>
void serialize(Archive& ar) {
ar(s_);
}
};
// External save function for boost::ptr_vector<T>.
template<class Archive, class T>
void save(Archive& ar, const boost::ptr_vector<T>& pv) {
ar(pv.size());
for (const auto& element : pv)
ar(element);
}
// External load function for boost::ptr_vector<T>.
template<class Archive, class T>
void load(Archive& ar, boost::ptr_vector<T>& pv) {
size_t n;
ar(n);
pv.reserve(n);
for (size_t i = 0; i < n; ++i) {
pv.push_back(new T);
ar(pv.back());
}
}
int main() {
// Serialize a boost::ptr_vector to a buffer.
std::ostringstream os;
{
boost::ptr_vector<MyRecord> saved;
saved.push_back(new MyRecord("how"));
saved.push_back(new MyRecord("now"));
saved.push_back(new MyRecord("brown"));
saved.push_back(new MyRecord("cow"));
cereal::BinaryOutputArchive oa(os);
oa(saved);
}
// Serialize from the buffer.
boost::ptr_vector<MyRecord> loaded;
{
std::istringstream is(os.str());
cereal::BinaryInputArchive ia(is);
ia(loaded);
}
for (const auto& element : loaded)
std::cout << element.s_ << '\n';
return 0;
}
Dies sollte mit jeder enthaltenen Art arbeiten, die Standard-konstruierbar ist und bereits einzeln serializable.
.... und für die die Überladungen für 'save' und' load' in einem _associated namespace_ (vgl. ADL) gefunden werden. Ich könnte hinzufügen, dass diese Version eine ziemlich witzige Konstruktionssemantik beim Laden hat. Es ist "ok", weil ptr_vectors sowieso keine Aliasing-Elemente haben können – sehe
@sehe, mit der witzigen Ladesemantik meinen Sie, dass dies effizienter gemacht werden kann? –
Eigentlich, nein, es sieht gut aus. – sehe
- 1. Probleme mit boost :: ptr_vector und boost :: jede
- 2. Qt entspricht boost :: ptr_vector?
- 3. Wie kopiert boost :: ptr_vector die darunterliegenden Objekte?
- 4. Serialisieren zu XML mit Boost :: Serialisierung
- 5. Zuordnung von boost :: ptr_vector in OpenMP-Schleife
- 6. wie boost :: uuids :: uuid zu serialisieren
- 7. Wie verwaltet ptr_vector Speicher?
- 8. Wie übertragen Sie den Besitz eines Elements von boost :: ptr_vector?
- 9. Getreide Serialisierungsfehler
- 10. Wie kann ich einen std :: Vektor mit boost :: serialisierung serialisieren?
- 11. Nachdem mein Getreide und es zu
- 12. Bildsegmentierung für Getreide
- 13. Ist es sicher eine rohe boost :: Variante zu serialisieren?
- 14. Wie Binärbaum zu serialisieren
- 15. wie HashSet zu serialisieren
- 16. wie Getreide laden oder XML-Attribut speichern
- 17. Wie Boost Serialisierung & Iostreams zu serialisieren & gzip ein Objekt zu string?
- 18. serialisieren Eigen Matrix mit boost.serialization
- 19. Wie geteilte/schwache Zeiger serialisieren?
- 20. Sollte ich boost :: ptr_vector <T> oder Vektor <boost :: shared_ptr <T>> verwenden?
- 21. Sollte boost :: ptr_vector an Ort und Stelle std :: vector die ganze Zeit verwendet werden?
- 22. Wie Objekt mit json4s zu AST zu serialisieren?
- 23. Wie Objekt zu Json mit Type Info mit Newtonsoft.Json serialisieren?
- 24. Soll ich mit NSCoder zu JSON serialisieren?
- 25. Verhindern, dass Getreide polymorphe Daten schreibt
- 26. Jackson: wie nur annotierte Eigenschaften zu serialisieren
- 27. Wie Little-Endian PODs schmerzfrei zu serialisieren?
- 28. PHP, wie Array von Objekten zu serialisieren?
- 29. REST-Framework: Wie Objekte zu serialisieren?
- 30. Serialisieren zu YAML mit XStream in Java
Ich bin nicht vertraut mit 'ptr_vector', aber es sieht aus wie es ist im Wesentlichen ein Wrapper um' std :: vector '. Cereal unterstützt keine rohen Pointer, daher halte ich es für unwahrscheinlich, dass Sie einen 'ptr_vector' serialisieren können, ohne wesentliche Änderungen an Cereal oder eine komplizierte Umgehungslösung. –
Azoth