Gio*_*diX 5 windows winapi serialization mfc 32bit-64bit
我正在处理非常旧的遗留代码,并将其从 32 位移植到 64 位。
我遇到的困难之一是 MFC 序列化。32 位和 64 位之间的区别之一是指针数据的大小。CArray这意味着,例如,如果由于某种原因我序列化了类似的大小
ar << m_array.GetSize();
Run Code Online (Sandbox Code Playgroud)
32 和 64 平台之间的数据不同,因为GetSize返回INT_PTR. 为了使序列化数据与以 32 位和 64 位编译的同一应用程序完全兼容,我在存储阶段强制使用数据类型,在读取时也强制使用相同的数据类型。(非常确定 32 位足以满足此数据)
店铺
ar << (int)m_array.GetSize();
Run Code Online (Sandbox Code Playgroud)
阅读
int iNumSize = 0;
ar >> iNumSize ;
Run Code Online (Sandbox Code Playgroud)
换句话说,应用程序无论是以 32 位还是 64 位编译,都可以像 as 一样序列化这些数据int。
现在我对类型的序列化有一个疑问CArray;CArray使用内置的CArchive序列化来序列化代码
//defined as CArray m_arrayVertex; on .h
m_arrayVertex.Serialize(ar);
Run Code Online (Sandbox Code Playgroud)
这是使用此模板Serialize在 MFC 文件中定义的afxtemp.h
template<class TYPE, class ARG_TYPE>
void CArray<TYPE, ARG_TYPE>::Serialize(CArchive& ar)
{
ASSERT_VALID(this);
CObject::Serialize(ar);
if (ar.IsStoring())
{
ar.WriteCount(m_nSize);
}
else
{
DWORD_PTR nOldSize = ar.ReadCount();
SetSize(nOldSize, -1);
}
SerializeElements<TYPE>(ar, m_pData, m_nSize);
}
Run Code Online (Sandbox Code Playgroud)
在哪里 (afx.h)
// special functions for reading and writing (16-bit compatible) counts
DWORD_PTR ReadCount();
void WriteCount(DWORD_PTR dwCount);
Run Code Online (Sandbox Code Playgroud)
我的问题是:ReadCount并WriteCount使用DWORD_PTR平台之间大小不同的...这种序列化在 32/64 位下兼容,或者由于大小变化,序列化数据仅分别在每个平台上工作?
我的意思是32位和64位应用程序都可以读取数据而不会出现错误?评论说它也适用于“16 位”,但我没有找到有关此序列化的任何详细信息。
如果这不起作用,是否有一种解决方法可以序列化数据,CArray使数据与 32 和 64 应用程序完全兼容?
编辑:两个答案都很好。我只是接受先到先得的解决方案。非常感谢两位,希望可以帮助别人!
正如您所写,ReadCount返回DWORD_PTR32 位或 64 位宽,具体取决于代码是否编译为 32 位代码或 64 位代码。
现在,只要实际对象计数适合 32 位,由 32 位或 64 位程序编写的文件之间的互操作性就不存在问题。
另一方面,如果您的 64 位代码序列化的 aCArray具有超过 4294967295 个元素(无论如何都不太可能发生),那么如果您想从 32 位程序读取反序列化该文件,您将遇到麻烦。但在 32 位程序上,aCArray无论如何都不能存储超过 4294967295 的内容。
长话短说,您不需要做任何特殊的事情,只需序列化/反序列化您的数据即可。
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |