• Boost序列化指针


    Boost.Serialization 还能序列化指针和引用。 由于指针存储对象的地址,序列化对象的地址没有什么意义,而是在序列化指针和引用时,对象的引用被自动地序列化

    代码

    #include  
    #include  
    #include  
    #include  
    
    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(); 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    结果

    0x1ff7bd0
    0x1ff7830
    1f
    
    • 1
    • 2
    • 3

    上面的应用程序创建了一个新的 person 类型的对象,使用 new 创建并赋值给指针 p 。 是指针 - 而不是 *p - 被序列化了。Boost.Serialization 自动地通过 p 的引用序列化对象本身而不是对象的地址。

    如果归档被恢复, p 不必指向相同的地址。 而是创建新对象并将它的地址赋值给 pBoost.Serialization 只保证对象和之前序列化的对象相同,而不是地址相同。

    由于新式的 C++ 在动态分配内存有关的地方使用 智能指针 (smart pointers) , Boost.Serialization 对此也提供了相应的支持。

    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    
    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_ptr<person> p(new person(31)); 
      oa << p; 
    } 
    
    void load() 
    { 
      boost::archive::text_iarchive ia(ss); 
      boost::scoped_ptr<person> p; 
      ia >> p; 
      std::cout << p->age() << std::endl; 
    } 
    
    int main() 
    { 
      save(); 
      load(); 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    例子中使用了智能指针 boost::scoped_ptr 来管理动态分配的 person 类型的对象。 为了序列化这样的指针,必须包含 boost/serialization/scoped_ptr.hpp 头文件。

    在使用 boost::shared_ptr 类型的智能指针的时候需要序列化,那么必须包含 boost/serialization/shared_ptr.hpp 头文件。

    下面的应用程序使用引用替代了指针。

    #include  
    #include  
    #include  
    #include  
    
    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::cout<<&p<<std::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(); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    输出结果

    0x7ffc362e9360
    0x7ffc362e9360 31
    
    • 1
    • 2

    指针数组

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    const int ARRAY_SIZE = 3;
    
    class SomeType {
    public:
        SomeType() : value(0) {}
        SomeType(int val) : value(val) {}
    
        int getValue() const { return value; }
    
        // 添加序列化函数
        template <class Archive>
        void 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 Archive>
        void 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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
  • 相关阅读:
    【Redis高级篇】分片集群--并发
    JavaScript 基础第二天笔记
    使用 frp 进行内网穿透
    11月30日(第二天)
    [深度学习][预训练模型]darknet-yolov7预训练模型下载地址
    AcWing 898. 数字三角形
    小程序中Java后台调用getAccessToken接口、msg_sec_check接口检测文本安全、小程序前端访问后端接口的方法
    【Java基础】什么是Java的注释?—21天学习计划打卡第一天
    QTableView合并单元格
    记一次Android项目升级Kotlin版本(1.5 -> 1.7)
  • 原文地址:https://blog.csdn.net/qq_40178082/article/details/133090769