2014-02-14 59 views
2

我想讀取/打開一個文件,該文件已經在Visual Studio 2013中創建的C++程序中用VC++ 6編譯序列化,但某些屬性/值未被讀取或以某種方式失蹤。從VC6到Visual Studio 2010的C++序列化up

請幫我理解這兩個版本有什麼不同,以及我如何才能解決它。

它使用的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); 
} 
+0

這完全取決於如何* *數據連載。你必須告訴我們更多關於這一點的信息。 – Angew

+0

也許你會在你的代碼的其他地方序列化CTime對象。在VS6中CTime只有4個字節,但從CT200的VS2003開始,長度爲8個字節,所以如果你用先前用VS6序列化過的VS2013反序列化一個CTime對象,你將遇到麻煩。 –

+0

不,不幸的是不是問題。我可以檢查其他課程嗎? – Jak

回答

1

我剛剛也有類似的問題,現在。它與在VC6上不支持的bool類型有關。

我有這個類:

class CTest 
{ 
    BOOL m_test ; 
    ... 
} 

在deserialisation我這樣做是在一些點:

ar >> m_test ; 
m_test = !m_test ; 

,系列化期間我這樣做:

ar << !m_test ; // problem was here 

提醒:BOOL是實際上在VC6和VC2010上的typedefd爲int

由於沒有真正的bool類型與VC6,!m_test的類型實際上是int,因此ar << !m_test調用CArchive::operator<<(int)。 但在VC2010上,!m_test的類型爲bool,因此調用了CArchive::operator<<(BYTE),並且在文件中釋放了3個字節。然後下一次你反序列化這個類時,m_test之後的所有內容都會被轉移,我們讀垃圾並且程序甚至會崩潰。

該解決方案僅僅是將!m_test轉換爲int

ar << (DWORD)!m_test ; 
0

需要注意的是:C++ bool有點'0'或'1'並歸檔爲int。

因此,當從carchive中讀取或在C#中使用二進制讀取器時,您必須讀取int 32並相應地執行操作。

我也跟着這樣說:

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

雖然這段代碼可能會回答這個問題,但提供關於爲什麼和/或代碼如何回答這個問題的附加上下文會提高它的長期價值。 – NathanOliver

+0

Ty Nathan我更新了一些信息:) – WPFKK