C++浅析序列数据封装与优化实现方法

发布时间:

封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全,数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制!

一、说明

用于优化的包装函数:本节介绍包装函数以优化序列化过程。这些函数标记对象以允许 Boost.Serialization 应用某些优化技术。

二、示范和代码

示例 64.14。在没有包装函数的情况下序列化数组

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
  text_oarchive oa{ss};
  boost::array<int, 3> a{{0, 1, 2}};
  oa << a;
}
void load()
{
  text_iarchive ia{ss};
  boost::array<int, 3> a;
  ia >> a;
  std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
  save();
  load();
}

C++浅析序列数据封装与优化实现方法

Example64.14

示例 64.14 使用没有任何包装函数的 Boost.Serialization。该示例创建值 22 serialization::archive 11 0 0 3 0 1 2 并将其写入字符串。使用包装函数 boost::serialization::make_array(),写入的值可以缩短为以下字符串:22 serialization::archive 11 0 1 2。

示例 64.15。使用包装函数 make_array() 序列化数组

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/array.hpp>
#include <array>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
  text_oarchive oa{ss};
  std::array<int, 3> a{{0, 1, 2}};
  oa << boost::serialization::make_array(a.data(), a.size());
}
void load()
{
  text_iarchive ia{ss};
  std::array<int, 3> a;
  ia >> boost::serialization::make_array(a.data(), a.size());
  std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
  save();
  load();
}

C++浅析序列数据封装与优化实现方法

boost::serialization::make_array ()函数需要地址和数组的长度。 由于长度是硬编码的,所以它不需要作为boost::array类型的一部分序列化。

换个说法就是:boost::serialization::make_array() 需要数组的地址和长度。但是,因为它是预先知道的,所以不需要将长度序列化为数组的一部分。

任何时候,如果boost::arraystd::vector包含一个可以直接序列化的数组,都可以使用这个函数。 其他一般需要序列化的属性不能被序列化。

另一个 Boost.Serialization 提供的封装函数是boost::serialization::make_binary_object ()。 与boost::serialization::make_array ()类似,它也需要地址和长度。boost::serialization::make_binary_object ()函数只是为了用来序列化没有底层结构的二进制数据,而boost::serialization::make_array ()是用来序列化数组的。

只要 std::array 或 std::vector 等类包含可以直接序列化的数组,就可以使用 boost::serialization::make_array()。跳过通常也会被序列化的其他成员变量(参见示例 64.15)。

Boost.Serialization 还提供包装器 boost::serialization::make_binary_object()。类似于 boost::serialization::make_array(),此函数需要一个地址和一个长度。 boost::serialization::make_binary_object() 仅用于没有底层结构的二进制数据,而 boost::serialization::make_array() 用于数组。