我正在阅读其他人的代码,并且有此类的序列化版本:
struct ObjectInfo
{
int32_t m_typeId;
string m_objectName;
vector<int32_t> m_haveKeysId;
map<int32_t,double> m_objectFeatures;
ObjectInfo():m_typeId(-1),m_objectName("")
{
m_objectFeatures.clear();
m_haveKeysId.clear();
}
}
它的二进制版本如下:
struct ObjectInfo_B
{
int32_t m_typeId;
int32_t m_objectNamePos;
int32_t m_startIndex;
int32_t m_endIndex;
int32_t m_haveKeysIdStartIndex;
int32_t m_haveKeysIdEndIndex;
ObjectInfo_B()
{
m_typeId = -1;
m_objectNamePos = 0;
m_startIndex = -1;
m_endIndex = -1;
m_haveKeysIdStartIndex = -1;
m_haveKeysIdEndIndex = -1;
}
然后有一个ObjectInfo的向量:
vector<ObjectInfo> *objectsVec;
ObjectInfo_B *bObjects;
...
现在要转换的代码如下:
startIndex = 0;
int32_t curBufferSize = 0;
for(size_t i = 0;i<objectsVec->size();i++)
{
bObjects[i].m_typeId = (*objectsVec)[i].m_typeId;
bObjects[i].m_objectNamePos = curBufferSize;
strcpy(m_objectNameBuffer+curBufferSize,(*objectsVec)[i].m_objectName.c_str());
curBufferSize += (*objectsVec)[i].m_objectName.size() + 1;
bObjects[i].m_startIndex = startIndex;
bObjects[i].m_endIndex = startIndex + (*objectsVec)[i].m_objectFeatures.size();
startIndex = bObjects[i].m_endIndex;
bObjects[i].m_haveKeysIdStartIndex = haveKeyStartIndex;
bObjects[i].m_haveKeysIdEndIndex = haveKeyStartIndex +(*objectsVec)[i].m_haveKeysId.size();
...
fwrite((char*)bObjects,sizeof(ObjectInfo_B),wcount,output);
这似乎很复杂,我不是连载的农家乐。有没有更简单的方法在 C++ 中做到这一点?快速搜索表明,下面的这个可以做类似的事情,但是它可以用更简单的方式对上面的代码进行转换吗?
https://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html