我正在为我的类编写自定义序列化程序,它应该将类对象序列化为字节数组。以下是我的示例代码:
[StructLayout(LayoutKind.Sequential)]
public class ATTRIBUTE_STR
{
public uint atType;
public uint atLen;
public byte[] atData = new byte[3];
public byte[] serialize()
{
byte[] temp = new byte[Marshal.SizeOf(this)];
byte[] buffer = BitConverter.GetBytes(atType);
Array.Copy(buffer, 0, temp, 0, buffer.Length);
buffer = null;
buffer = BitConverter.GetBytes(atLen);
Array.Copy(buffer, 0, temp, 4, buffer.Length);
Array.Copy(this.atData, 0, temp, 8, this.atData.Length);
return temp;
}
};
然而,字节数组atData因为它如何以字节对齐方式存储在内存中,所以它没有正确地进入临时字节数组。由于字节数组具有偶数字节对齐。
如何序列化此对象以解释内存中成员的对齐?
编辑:我知道还有其他选项,如编组或ProtocolBuffers,但我想使用我的自定义序列化器。答案 0 :(得分:1)
你的大小调用可能没有返回你认为的那个,但是如果你要坚持使用硬编码的输出偏移,那么对于Sizeof几乎没有什么担心。]
所以你不妨做这样的事情:
byte[] temp = new byte[8+atLen.Length];
BitConverter.GetBytes(atType).CopyTo(temp,0);
BitConverter.GetBytes(atLen).CopyTo(temp,4);
this.AtData.CopyTo(temp,8);
return temp;
更新:Sizeof返回存储对象所需的非托管空间量 - 但请记住,您的atData数组内容未存储在对象中,它们位于对象引用的数组对象中。所以Marshal.Sizeof不会给你一个包含数组大小的答案 - 事实上,如果你让Marshal.Sizeof给你一个Sizeof(atData),你就会得到一个例外。