正在读取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。有人知道是否总是这样吗?
使用上面的代码项目文章,这里有一个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);
}
}
}
}