テンプレート クラスとテンプレート関数のシリアル化と逆シリアル化を実装するにはどうすればよいですか?

WBOY
リリース: 2024-04-24 12:27:02
オリジナル
907 人が閲覧しました

テンプレート クラスとテンプレート関数のシリアル化と逆シリアル化は、バイナリ アーカイブ、独自のシリアル化、関数ポインター、関数オブジェクトの使用など、さまざまな方法で実現できます。バイナリ アーカイブを使用してテンプレート クラスをファイルに直接書き込み/読み取りし、独自のシリアル化を使用してカスタムのシリアル化/逆シリアル化メソッドを定義します。テンプレート関数の場合、関数ポインターまたは関数オブジェクトを使用してシリアル化/逆シリアル化できます。

テンプレート クラスとテンプレート関数のシリアル化と逆シリアル化を実装するにはどうすればよいですか?

テンプレート クラスとテンプレート関数のシリアル化と逆シリアル化を実装する方法

C では、テンプレート クラスとテンプレート関数が汎用プログラミングで広く使用されています。これらのテンプレート インスタンスをシリアル化および逆シリアル化する機能は、ネットワークまたはストレージ全体で送信または永続化する必要がある場合に重要です。この記事では、テンプレート クラスとテンプレート関数のシリアル化と逆シリアル化を実装するいくつかの方法を紹介します。

シリアル化テンプレート クラス

1. バイナリ アーカイブを使用します

// 写入归档
std::ofstream ofs("template_class.bin");
boost::archive::binary_oarchive oa(ofs);
oa << my_template_class<int, std::string>;

// 读取归档
std::ifstream ifs("template_class.bin");
boost::archive::binary_iarchive ia(ifs);
std::pair<int, std::string> my_deserialized_class;
ia >> my_deserialized_class;
ログイン後にコピー

2. 独自のシリアル化テンプレート関数を使用します

// 定义一个序列化方法
template <typename T1, typename T2>
void serialize(const my_template_class<T1, T2>& obj, std::ostream& out) {
  out.write((char*)&obj.first, sizeof(T1));
  out.write((char*)&obj.second, sizeof(T2));
}

// 定义一个反序列化方法
template <typename T1, typename T2>
void deserialize(my_template_class<T1, T2>& obj, std::istream& in) {
  in.read((char*)&obj.first, sizeof(T1));
  in.read((char*)&obj.second, sizeof(T2));
}
ログイン後にコピー

##1関数ポインターを使用します。

// 定义一个模板函数
template <typename T>
T square(T x) {
  return x * x;
}

// 定义一个序列化方法
void* serialize_function(void* function) {
  return function;
}

// 定义一个反序列化方法
void* deserialize_function(void* function) {
  return function;
}
ログイン後にコピー

2. 関数オブジェクト (Functor) を使用します。

// 定义一个函数对象
struct Square {
  template <typename T>
  T operator()(T x) {
    return x * x;
  }
};

// 定义一个序列化方法
void serialize_function(const Square& obj, std::ostream& out) {
  // 这里可以根据实际情况添加更多数据
  out.write((char*)&obj, sizeof(Square));
}

// 定义一个反序列化方法
void deserialize_function(Square& obj, std::istream& in) {
  // 这里可以根据实际情况读入更多数据
  in.read((char*)&obj, sizeof(Square));
}
ログイン後にコピー

実際のケース

次は、バイナリ アーカイブのシリアル化と

std::pair の逆シリアル化です。

テンプレート クラスの例:

#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>

using namespace std;

int main() {
  // 创建一个 std::pair 模板实例
  pair<int, string> my_pair = make_pair(10, "Hello World");

  // 写入归档
  ofstream ofs("pair.bin");
  boost::archive::binary_oarchive oa(ofs);
  oa << my_pair;

  // 从归档中恢复
  ifstream ifs("pair.bin");
  boost::archive::binary_iarchive ia(ifs);
  pair<int, string> my_deserialized_pair;
  ia >> my_deserialized_pair;

  // 输出恢复后的数据
  cout << my_deserialized_pair.first << " " << my_deserialized_pair.second << endl;

  return 0;
}
ログイン後にコピー

以上がテンプレート クラスとテンプレート関数のシリアル化と逆シリアル化を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート