2012-02-19 72 views
1

將MFC CArray序列化並保存到數據庫。我需要將這些數據讀入C#項目。我能夠從數據庫中以字節[]的形式檢索數據。然後我將byte []寫入MemoryStream。現在我需要從MemoryStream讀取數據。在C中讀取序列化的MFC CArray#

有人顯然已經解決了這個問題,但沒有寫出他們的解決方案。

http://social.msdn.microsoft.com/Forums/eu/csharpgeneral/thread/17393adc-1f1e-4e12-8975-527f42e5393e 

我跟着這些項目,試圖解決這個問題。

http://www.codeproject.com/Articles/32741/Implementing-MFC-Style-Serialization-in-NET-Part-1

http://www.codeproject.com/Articles/32742/Implementing-MFC-Style-Serialization-in-NET-Part-2

在字節[]中的第一件事情是該陣列的尺寸,並且我可以檢索與binaryReader.readInt32()。但是,我似乎無法取回浮點值。如果我嘗試binaryReader.readSingle()或

public void Read(out float d) { 
    byte[] bytes = new byte[4]; 
    reader.Read(bytes, m_Index, 4); 
    d = BitConverter.ToSingle(bytes, 0); 
} 

我不回收正確的數據。我錯過了什麼?

編輯下面是序列化數據

typedef CArray<float, float> FloatArray; 
FloatArray floatArray; 
// fill floatArray 
CSharedFile memoryFile(GMEM_MOVEABLE | GMEM_ZEROINIT); 
CArchive ar(&memoryFile, CArchive::store); 
floatArray.Serialize(ar); 
ar.Close(); 

EDIT 2

通過落後讀書,我能得到所有彩車的C++代碼,並且還能夠確定CArray的大小是byte [2]還是Int16。有誰知道這是否總是如此?

+0

您確定數據保存爲單個而不是雙倍,例如? – 2012-02-19 16:38:18

+0

查看我的編輯,瞭解如何在C++代碼中對數據進行序列化。謝謝! – kdrag136 2012-02-19 16:51:28

回答

1

使用上面的codeproject文章,這裏是一個CArray的C#實現,它將允許您反序列化一個序列化的MFC CArray。

// Deriving from the IMfcArchiveSerialization interface is not mandatory 
public class CArray : IMfcArchiveSerialization { 
    public Int16 size; 
    public List<float> floatValues; 

    public CArray() { 
     floatValues = new List<float>(); 
    } 

    virtual public void Serialize(MfcArchive ar) { 
     if(ar.IsStoring()) { 
      throw new NotImplementedException("MfcArchive can't store"); 
     } 
     else { 
      // be sure to read in the order in which they were stored 
      ar.Read(out size); 

      for(int i = 0; i < size; i++) { 
       float floatValue; 
       ar.Read(out floatValue); 
       floatValues.Add(floatValue); 
      } 
     } 
    } 
}