以前、私のプログラムstd::multimap<Participant*, Connection*>
は、完全に入力された後、全体をシリアル化するために使用されていました。arc & _connections
これは、保存と復元の両方で簡単でした。
ただし、すべての接続オブジェクトをメモリに保持する必要があります。しかし、シリアル化以外にはこれらのオブジェクトは必要ありません。したがって、メモリ消費を最小限に抑えるためstd::make_pair(connection->participant(), connection)
に、作成されたらすぐにシリアル化することにしました。シリアル化が完了したら削除します。
マルチマップの予想サイズは、入力が開始される前にわかっています。
私が欲しいのは、これらのペアを手動でシリアル化して、逆シリアル化コードを変更する必要がないようにすることです。arc & _connections;
boost/serialization/collections_save_imp.hpp
なるほど_
boost::serialization::save_construct_data_adl(
ar,
&(*it),
boost::serialization::version<BOOST_DEDUCED_TYPENAME Container::value_type>::value
);
ar << boost::serialization::make_nvp("item", *it++);
だから私は次のようなものを使用する必要があります
typedef std::pair<Participant*, Connection*> PairT;
ar << BOOST_SERIALIZATION_NVP(expected_size);
if(3 < ar.get_library_version()){// I don't really understand this magic number here
const unsigned int item_version = boost::serialization::version<PairT>::value;
ar << BOOST_SERIALIZATION_NVP(item_version);
}
PairT pair = std::make_pair(connection->participant(), connection);
boost::serialization::save_construct_data_adl(
ar,
pair,
boost::serialization::version<PairT>::value
);
ar << boost::serialization::make_nvp("item", pair);
delete connection;
私はそれがどのように行われるべきか正確にはわかりません。推測するだけです。