【发布时间】:2010-05-02 23:16:08
【问题描述】:
我有一个 C# 函数,它可以将字节数组转换为类,给定它的类型:
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(data, 0, buffer, rawsize);
object result = Marshal.PtrToStructure(buffer, type);
Marshal.FreeHGlobal(buffer);
我使用顺序结构:
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat { }
这很好,直到我尝试转换为包含字节数组的结构/类。
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat
{
public byte header;
public byte[] data = new byte[256];
}
Marshal.SizeOf(type) 返回 16,该值太低(应为 257)并导致 Marshal.PtrToStructure 失败并出现以下错误:
试图读取或写入受保护的内存。这通常表明其他内存已损坏。
我猜使用固定数组会是一种解决方案,但也可以不用求助于不安全的代码来完成吗?
【问题讨论】:
-
你能用二进制序列化器/反序列化器代替吗? mikehadlow.blogspot.com/2006/11/…
-
你能多介绍一下你正在做的事情吗?如果可能的话,使用内置的序列化类会省去很多麻烦。
标签: c# serialization struct