我们使用boost :: serialization来序列化和反序列化一个带有std :: vector<的类。 struct>到普通文件。反序列化过程在将条目添加到向量之前创建新的类实例。 由于我们处于多线程应用程序中,因此我们希望在反序列化过程中确保正确的临界区锁定。
template<class obj>
inline void MetaSerialize(std::string strKey, obj *ptr)
{
LOCK(ptr->csAccess);
std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
boost::archive::binary_oarchive oa(stream);
oa << ptr;
if (!m_pMetaDB->Put(rocksdb::WriteOptions(), strKey, rocksdb::Slice(stream.str().data(), stream.tellp())).ok())
LOG_ERROR("Unable to serialize " + strKey, "SM");
};
template<class obj>
void MetaDeserialize(std::string strKey, obj *ptr)
{
if (*ptr)
{
delete *ptr;
*ptr = NULL;
}
std::string strTmp;
if (m_pMetaDB->Get(rocksdb::ReadOptions(), strKey, &strTmp).ok())
{
std::stringstream stream(strTmp);
boost::archive::binary_iarchive ia(stream);
ia >> *ptr;
}
};
我的想法是使用反序列化过程的前后函数来锁定或解锁关键部分。
可悲的是,我没有在文档中找到这些钩子或函数。有没有我没有找到或者是否有不同的功能可用于通过反序列化过程建立安全锁定?
提前致谢
答案 0 :(得分:1)
你不需要挂钩。
如果没有正确的同步(他们总是会错误地使用你的对象),你不必担心有人不小心调用你的序列化函数。
只需公开执行锁定的同步序列化操作。