Visual c++ C++;从VC6到Visual Studio 2010的序列化 我试图读取/打开一个文件,该文件已经在Visual Studio 2013中创建的C++程序中用VC++ 6构建了,一些属性/值没有被读取或丢失。

Visual c++ C++;从VC6到Visual Studio 2010的序列化 我试图读取/打开一个文件,该文件已经在Visual Studio 2013中创建的C++程序中用VC++ 6构建了,一些属性/值没有被读取或丢失。,visual-c++,serialization,mfc,visual-c++-6,Visual C++,Serialization,Mfc,Visual C++ 6,请帮助我理解这两个版本的不同之处,以及我如何解决它 使用CArchive将其存储如下: void CCubeShelf::Serialize(CArchive &ar,BOOL bChildren, int iVersion) { if(ar.IsStoring()) { m_dwProperties |= CSHELF_MERCH | CSHELF_MERCH_DEPTH; ar << m_dwProperties;

请帮助我理解这两个版本的不同之处,以及我如何解决它

使用CArchive将其存储如下:

void CCubeShelf::Serialize(CArchive &ar,BOOL bChildren, int iVersion)
{
    if(ar.IsStoring())
    {
        m_dwProperties |= CSHELF_MERCH | CSHELF_MERCH_DEPTH;
        ar << m_dwProperties;
        ar << m_iShelfNum;
        ar << m_fDividerWidth;
        ar << m_fDividerSpacing;

        ar << m_fGrillHeight;
        ar << m_crGrillColor;
        ar << m_fMercHeight;
        ar << m_fMerchDepth;
        ar << m_csFrontPath;
        ar << m_csLeftPath;
        ar << m_csTopPath;
        }
        else
            {
        ar >> m_dwProperties;
        ar >> m_iShelfNum;
        ar >> m_fDividerWidth;
        ar >> m_fDividerSpacing;
        ar >> m_fGrillHeight;
        ar >> m_crGrillColor;
        if( m_dwProperties & CSHELF_MERCH ) ar >> m_fMercHeight;
        if( m_dwProperties & CSHELF_MERCH_DEPTH )
        {
            ar >> m_fMerchDepth;
            ar >> m_csFrontPath;
            ar >> m_csLeftPath;
            ar >> m_csTopPath;
        }
    }

    CCube::Serialize(ar,bChildren,iVersion);
}
void CCubeShelf::序列化(CArchive&ar、BOOL-bChildren、int-version)
{
if(ar.IsStoring())
{
m|u dwProperties |=CSHELF|u MERCH | CSHELF|u MERCH|u深度;
ar>m_颜色;
如果(m_dwProperties&CSHELF_MERCH)ar>>m_FMERCHOW;
if(m_dwProperties和CSHELF_MERCH_DEPTH)
{
ar>>m_fMerchDepth;
ar>>m_csFrontPath;
ar>>m_csLeftPath;
ar>>m_csTopPath;
}
}
CCube::序列化(ar、bChildren、版本);
}

我现在也遇到了类似的问题。它与VC6不支持的
bool
类型有关

我上过这门课:

class CTest
{
  BOOL m_test ;
  ...
}
在反序列化过程中,我曾在某个时候这样做:

ar >> m_test ;
m_test = !m_test ;
在连载过程中,我做到了:

ar << !m_test ;  // problem was here

请注意:C++布尔是一个“0”或“1”位,存档为INT.< /P> 因此,当从carchive或在C#中使用二进制读取器读取数据时,必须读取int 32并相应地执行

我是这样说的:

var br= new BinaryReader(targetStream);
....
....
,....
var boolValue= br.ReadInt32()==1;
....
....
....

这完全取决于数据是如何序列化的。您必须告诉我们更多关于这一点。也许您可以在代码的其他地方序列化CTime对象。在VS6中,CTime只有4个字节,但从VS2003到CTime的长度是8个字节,因此,如果您使用VS2013反序列化以前使用VS6序列化的CTime对象,您将遇到问题。不,不幸的是没有问题。我还可以检查其他类吗?事实证明,序列化从来都不是问题,但实际上,=运算符在升级到visual studio后不再过载,你知道为什么吗?你是说哪个
=运算符
?虽然这段代码可以回答这个问题,提供关于此代码为什么和/或如何回答此问题的附加上下文可提高其长期价值。
var br= new BinaryReader(targetStream);
....
....
,....
var boolValue= br.ReadInt32()==1;
....
....
....