日期:2014-05-18  浏览次数:21287 次

C# Byte[] 转struct时候遭遇exception
namespace ByteToStruct
{
  class Program
  {
  static void Main(string[] args)
  {
  FileStream f = new FileStream("test.dbf", FileMode.Open, FileAccess.Read);
  BinaryReader br = new BinaryReader(f);
  //BinaryWriter bw = new BinaryWriter(f);
  test_struct str = new test_struct();
  byte[] bt = new byte[Marshal.SizeOf(str)];
  br.Read(bt, 0, Marshal.SizeOf(str));
  str = (test_struct)BytesToStruts(bt,str.GetType());
  }
  public static object BytesToStruts(byte[] bytes, Type type)
  {
  //得到结构体的大小  
  int size = Marshal.SizeOf(type);
  //byte数组长度小于结构体的大小  
  if (size > bytes.Length)
  {
  //返回空  
  return null;
  }
  //分配结构体大小的内存空间  
  IntPtr structPtr = Marshal.AllocHGlobal(size);
  //将byte数组拷到分配好的内存空间  
  Marshal.Copy(bytes, 0, structPtr, size);
  //将内存空间转换为目标结构体  
  object obj = Marshal.PtrToStructure(structPtr, type);
  //释放内存空间  
  Marshal.FreeHGlobal(structPtr);
  //返回结构体  
  return obj;
  }  
  }
}
test_struct里面就两个字段一个int类型的id另外一个string类型的name

------解决方案--------------------
探讨
我先是将struct赋值用二进制写进文件 没有问题 然后读取的时候就会报错“尝试读取或写入受保护的内存
然后奇怪的是 我把string那个字段去掉 就没有问题。。难道在struct里面放一个string就会读取错误吗?

------解决方案--------------------
string类型和int不同,想通过二进制的读写来完成序列化和反序列化不行的,用2楼说的BinaryFormatter来完成对象的序列化和反序列化