在C#中读取序列化MFC CArray

时间:2012-02-19 16:32:56

标签: c# .net arrays serialization mfc

MFC CArray已序列化并保存到数据库中。我需要将这些数据读入C#项目。我能够从数据库中检索数据为byte []。然后我将byte []写入MemoryStream。现在我需要从MemoryStream中读取数据。

之前有人显然已经解决了这个问题,但没有写出他们的解决方案。

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

byte []中的第一件事是数组的大小,我可以使用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);
}

我没有收到正确的数据。我错过了什么?

编辑以下是序列化数据的C ++代码

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();

编辑2

通过向后阅读,我能够获得所有浮点数,并且还能够确定CArray的大小是字节[2]或Int16。有谁知道这种情况总是如此吗?

1 个答案:

答案 0 :(得分: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);
            }
        }
    }
}