提升序列化库有用吗?为什么不支持"pointer to pointer"序列化?
Is boost serialization library is userful? Why doesn't it support "pointer to pointer" serialization?
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 更是如此) - 但我怀疑你是否遇到过它们,尤其是在任何重要的代码中......
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- 提升序列化库有用吗?为什么不支持"pointer to pointer"序列化?