我想反序列化一个字节数组到一个结构。为什么我的返回对象与我接收的对象不匹配?
这里是我的反序列化功能:
void RawDeserialize(byte[] bytearray, object obj)
{
int len = Marshal.SizeOf(obj);
IntPtr i = Marshal.AllocHGlobal(len);
Marshal.Copy(bytearray, 0, i, len);
obj = Marshal.PtrToStructure(i, obj.GetType());
Marshal.FreeHGlobal(i);
}
我把它与
RawDeserialize(outarr, outbuf);
哪里outarr是一个长度为22和outbuf中的字节数组是我的结构看起来像这样:
[StructLayout(LayoutKind.Sequential,Size =22)]
public struct ID_OUTPUT
{
public HEADER_OUTPUT hdr; //Another struct size=8
public byte bType;
public byte bRunning;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 8)]
public string softwareName;
public short softwareVersion;
}
当我在我的反序列化函数中逐步调试时,obj填充了正确的值,但返回outbuf填充零(或从未分配,因为我最初初始化为零)。
我最初的想法是对象没有被引用传递,但我认为这应该工作,因为我发现这个反序列化函数在另一个SO问题上(我没有链接了)。
于是我尝试使用裁判关键字,但后来我得到一个错误无法从裁判ID_OUTPUT转换为参考对象。
你为什么这么认为? (我知道你是对的,但一些解释将有助于OP) –
@PatrickHofman OP的对象的使用,而不是实际的类型,加上OP的评论(我想对其他结构使用这种反序列化方法_) – ken2k
好吧,但它是做什么的。为什么它有助于OP? –