读书人

C# Byte[] 转struct时分遭遇exception

发布时间: 2012-06-30 17:20:12 作者: rapoo

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来完成对象的序列化和反序列化

读书人网 >C#

热点推荐