网站建设程序结构,项目管理软件project手机版,wap是什么意思的缩写,阿里巴巴网站国际站建设Boost.Serialization 还能序列化指针和引用。 由于指针存储对象的地址#xff0c;序列化对象的地址没有什么意义#xff0c;而是在序列化指针和引用时#xff0c;对象的引用被自动地序列化。
代码
#include boost/archive/text_oarchive.hpp
#include boost/…Boost.Serialization 还能序列化指针和引用。 由于指针存储对象的地址序列化对象的地址没有什么意义而是在序列化指针和引用时对象的引用被自动地序列化。
代码
#include boost/archive/text_oarchive.hpp
#include boost/archive/text_iarchive.hpp
#include iostream
#include sstream std::stringstream ss; class person
{
public: person() { } person(int age) : age_(age) { } int age() const { return age_; } private: friend class boost::serialization::access; template typename Archive void serialize(Archive ar, const unsigned int version) { ar age_; } int age_;
}; void save()
{ boost::archive::text_oarchive oa(ss); person *p new person(31); oa p; std::cout std::hex p std::endl; delete p;
} void load()
{ boost::archive::text_iarchive ia(ss); person *p; ia p; std::cout std::hex p std::endl; std::cout p-age() std::endl; delete p;
} int main()
{ save(); load();
} 结果
0x1ff7bd0
0x1ff7830
1f上面的应用程序创建了一个新的 person 类型的对象使用 new 创建并赋值给指针 p 。 是指针 - 而不是 *p - 被序列化了。Boost.Serialization 自动地通过 p 的引用序列化对象本身而不是对象的地址。
如果归档被恢复 p 不必指向相同的地址。 而是创建新对象并将它的地址赋值给 p 。 Boost.Serialization 只保证对象和之前序列化的对象相同而不是地址相同。
由于新式的 C 在动态分配内存有关的地方使用 智能指针 (smart pointers) Boost.Serialization 对此也提供了相应的支持。
#include boost/archive/text_oarchive.hpp
#include boost/archive/text_iarchive.hpp
#include boost/serialization/scoped_ptr.hpp
#include boost/scoped_ptr.hpp
#include iostream
#include sstream std::stringstream ss; class person
{
public: person() { } person(int age) : age_(age) { } int age() const { return age_; } private: friend class boost::serialization::access; template typename Archive void serialize(Archive ar, const unsigned int version) { ar age_; } int age_;
}; void save()
{ boost::archive::text_oarchive oa(ss); boost::scoped_ptrperson p(new person(31)); oa p;
} void load()
{ boost::archive::text_iarchive ia(ss); boost::scoped_ptrperson p; ia p; std::cout p-age() std::endl;
} int main()
{ save(); load();
} 例子中使用了智能指针 boost::scoped_ptr 来管理动态分配的 person 类型的对象。 为了序列化这样的指针必须包含 boost/serialization/scoped_ptr.hpp 头文件。
在使用 boost::shared_ptr 类型的智能指针的时候需要序列化那么必须包含 boost/serialization/shared_ptr.hpp 头文件。
下面的应用程序使用引用替代了指针。
#include boost/archive/text_oarchive.hpp
#include boost/archive/text_iarchive.hpp
#include iostream
#include sstream std::stringstream ss; class person
{
public: person() { } person(int age) : age_(age) { } int age() const { return age_; } private: friend class boost::serialization::access; template typename Archive void serialize(Archive ar, const unsigned int version) { ar age_; } int age_;
}; void save()
{ boost::archive::text_oarchive oa(ss); person p(31); person pp p; std::coutpstd::endl;oa pp;
} void load()
{ boost::archive::text_iarchive ia(ss); person p; person pp p; ia pp; std::cout p pp.age() std::endl;
} int main()
{ save(); load(); 输出结果
0x7ffc362e9360
0x7ffc362e9360 31指针数组
#include iostream
#include fstream
#include string
#include boost/archive/text_oarchive.hpp
#include boost/archive/text_iarchive.hpp
#include boost/serialization/vector.hppconst int ARRAY_SIZE 3;class SomeType {
public:SomeType() : value(0) {}SomeType(int val) : value(val) {}int getValue() const { return value; }// 添加序列化函数template class Archivevoid serialize(Archive ar, const unsigned int version) {ar value;}private:int value;
};class MyClass {friend class boost::serialization::access;public:MyClass() default;int data;SomeType* pointers[ARRAY_SIZE];template class Archivevoid serialize(Archive ar, const unsigned int version) {ar data;for (int i 0; i ARRAY_SIZE; i) {ar pointers[i];}}
};int main() {MyClass obj;obj.data 42;for (int i 0; i ARRAY_SIZE; i) {obj.pointers[i] new SomeType(i * 10);}{std::ofstream file(my_class_data.txt);boost::archive::text_oarchive oa(file);oa obj;}for (int i 0; i ARRAY_SIZE; i) {delete obj.pointers[i];}MyClass loadedObj;{std::ifstream file(my_class_data.txt);boost::archive::text_iarchive ia(file);ia loadedObj;}std::cout Loaded Object Data: loadedObj.data std::endl;for (int i 0; i ARRAY_SIZE; i) {std::cout loadedObj.pointers[i]-getValue() std::endl;delete loadedObj.pointers[i];}return 0;
}