正在读取C#中的序列化MFC CArray

本文关键字:序列化 MFC CArray 读取 | 更新日期: 2023-09-27 18:25:02

MFC CArray已序列化并保存到数据库中。我需要将这些数据读入C#项目中。我能够从数据库中以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);
}

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

EDIT这是序列化数据的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的大小是byte[2]或Int16。有人知道是否总是这样吗?

正在读取C#中的序列化MFC CArray

使用上面的代码项目文章,这里有一个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);
            }
        }
    }
}