【发布时间】:2022-01-13 23:16:52
【问题描述】:
我在看别人的代码,有这个类的序列化版本:
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
【问题讨论】:
-
您是否考虑过将其转换为 JSON?或者this怎么样?
-
二进制序列化是出了名的困难并且通常不可移植。(不能保证精确的内存布局)。您最好序列化为某些文本格式(如 xml、json、yaml)。如果您需要存储大量数据,请寻找可以执行此操作的库(或者您最终不得不自己编写代码,其规范如下:一个 int 需要 4 个字节存储小端,一个字符串以一个整数开头,说明它的大小后跟 utf-8 编码字符...等等..等等..
-
@PepijnKramer 在没有完全理解作者意图的情况下,我不想将其转换为 JSON。此代码将纯文本数据加载到 ObjectInfo 中,将其转换为 ObjectInfo_B 并将其序列化为二进制格式文件作为输出。
-
有没有更好的方法来为这个类进行对象序列化? -- 以基于意见的方式结束。如果您的方式有效,而其他人认为“更好的方式”是使用库或知名格式,那么...
-
我也不知道意图;)但是编写的二进制版本很脆弱,只有在所有编译器设置等(操作系统、目标 cpu 等)都完全保留后才能读回一样的。
标签: c++ serialization object-serialization