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。有谁知道这种情况总是如此吗?
答案 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);
}
}
}
}