我正在处理非常古老的遗留代码,并将其从32位移植到64位。
我遇到问题的其中一个方面是MFC序列化。 32位和64位之间的差异之一是指针数据的大小。 这意味着,例如,如果出于某种原因我已经对CArray
的大小进行了序列化,则需要考虑指针大小的变化。
ar << m_array.GetSize();
32位和64位平台之间的数据不同,因为GetSize
返回一个INT_PTR
。为了获得与在32位和64位编译的同一应用程序完全兼容的序列化数据,在存储阶段强制数据类型,并在读取时进行相同操作。(非常确定32位对于这个数据足够了)
存储
ar << (int)m_array.GetSize();
读取
int iNumSize = 0;
ar >> iNumSize ;
换句话说,无论是编译成32位还是64位的应用程序,都会将这些数据序列化为
int
。现在我对CArray
类型的序列化有一个疑问;为了序列化一个CArray
,代码使用了内置的CArchive
序列化。//defined as CArray m_arrayVertex; on .h
m_arrayVertex.Serialize(ar);
而这个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);
}
位于 (afx.h
) 文件中
// special functions for reading and writing (16-bit compatible) counts
DWORD_PTR ReadCount();
void WriteCount(DWORD_PTR dwCount);
这是我的问题:`ReadCount` 和 `WriteCount` 使用 `DWORD_PTR`,它们在不同平台上的大小不同……这种序列化能够兼容32位/64位吗?或者由于大小的变化,序列化的数据只能在各自的平台上工作?
我的意思是,这些数据可以被32位和64位应用程序都读取而没有错误吗?评论中说它也适用于“16位”,但我没有找到有关此序列化的详细信息。
如果这样做行不通,是否有一种解决方法可以序列化 `CArray`,以使数据与32位和64位应用程序完全兼容?
编辑:两个答案都很好。我只是接受第一个给出的答案作为解决方案。非常感谢两位,希望能帮助其他人!
int
类型总是一个坏主意,因为int
类型的大小不同。这就是为什么在提供的答案中都使用像我已经说明的变量。因此,如果您要进行强制转换,请将其转换为在不同位版本之间保持恒定的变量。 - Andrew Truckleint
和long
无论目标架构如何都是32位。运行代码的操作系统没有影响,编译器已经做出了决定。更多信息请参见这里。 - IInspectable