提升序列化库有用吗?为什么不支持"pointer to pointer"序列化?

Is boost serialization library is userful? Why doesn't it support "pointer to pointer" serialization?

本文关键字:pointer 序列化 to 不支持 为什么 升序 有用      更新时间:2023-10-16

Boost 序列化库功能强大,但有些功能我无法忍受。例如,Person是一个类,而我有一群人:

int n = 10;
Person **persons = new Person*[n];
for(int i = 0; i < n; i++) {
    persons[i] = new Person(...);  // whatever Person is.
}

在这里,我想序列化人员,但它没有奏效。如果我像这样更改代码:

Person *persons[10];
for(int i = 0; i < n; i++) {
    persons[i] = new Person(...);  // whatever Person is.
}

现在它确实起作用了。但是在我的项目中,n 不是常数。所以我想知道为什么 boost 序列化库不支持"指针到指针"序列化。在实际项目中,"指针指向指针"很常见,但 boost 不支持。那么,提升序列化库有用吗?我不这么认为。。。

我认为你应该使用容器,但是,如果分析器说你,那个向量太慢了,你可以序列化指针,我不知道它有什么问题。

文档

因此,您可以只使用(也可以在元素之前存储大小)

for (int i = 0; i < n; i++)
{
   ar & persons[i];
}

其中ar是存档。

简单的现场示例

序列化:

archive::binary_oarchive oa(ss);
oa << n << boost::serialization::make_array(persons, n);

反序列化:

archive::binary_iarchive ia(ss);
size_t loaded_size;
ia >> loaded_size;
Person** loaded = new Person*[loaded_size];
ia >> boost::serialization::make_array(loaded, loaded_size);

测试:

assert(n == loaded_size);
for (size_t i = 0; i < n; ++i)
    assert(*persons[i] == *loaded[i]);

科里鲁现场观看

#include <boost/serialization/serialization.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <iostream>
#include <sstream>
using namespace boost;
class Person {
  public:
    Person(int a = 0) : age(a) {}
    bool operator==(const Person &rhs) const { return age == rhs.age; }
  private:
    int age;
    friend class boost::serialization::access;
    template <typename Archive> void serialize(Archive &a, unsigned int) { a &age; }
};
Person** make_persons(size_t n) {
    Person **persons = new Person *[n];
    int i = 10;
    std::generate_n(persons, n, [i]{ return new Person(i); });
    return persons;
}
void free_persons(Person** persons, size_t n) {
    std::for_each(persons, persons+n, [](Person*p){ delete p; });
    delete[] persons;
}
int main() {
    const size_t n = 10;
    Person** persons = make_persons(n);
    std::stringstream ss;
    archive::binary_oarchive oa(ss);
    oa << n << serialization::make_array(persons, n);
    archive::binary_iarchive ia(ss);
    size_t loaded_size;
    ia >> loaded_size;
    Person** loaded = new Person*[loaded_size];
    ia >> serialization::make_array(loaded, loaded_size);
    assert(n == loaded_size);
    for (size_t i = 0; i < n; ++i)
        assert(*persons[i] == *loaded[i]);
    free_persons(loaded, n);
    free_persons(persons, n);
}

C++ 标准没有为提升库(或任何其他代码)提供一种方法来知道指向T点的"T数组"的大小。 这就是为什么 - 例如 - main()argc. 因此,如果没有您的帮助,它将无法工作。 这就是为什么最好使用标准容器的原因。 你对性能的反对对我来说听起来像 FUD......有一两个小的性能问题(C++03 更是如此) - 但我怀疑你是否遇到过它们,尤其是在任何重要的代码中......