【问题标题】:Serializing a class to a byte array in c#在c#中将类序列化为字节数组
【发布时间】:2013-11-26 16:00:37
【问题描述】:

我正在为我的类编写自定义序列化程序,它应该将类对象序列化为字节数组。以下是我的示例代码:

[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 因为它是如何以字节对齐方式存储在内存中的,所以它没有正确地进入临时字节数组。由于字节数组具有均匀的字节对齐。

我如何序列化这个对象以考虑内存中成员的对齐方式?

编辑:我知道还有其他选项,例如 Marshalling 或 ProtocolBuffers,但我想使用我的自定义序列化程序。

【问题讨论】:

  • 您的意思是使用struct 而不是class?您可以通过Marshal.OffsetOf() 获取非托管内存中的结构偏移量
  • 不,我的意思是一堂课。
  • “我认为它没有被正确地复制到字节数组中。” - 你能解释一下你的实际问题吗?
  • 我已经在问题中编辑了它
  • 您将“不正确”更改为“不正确”,这几乎没有帮助。显示您希望在数组中出现的内容以及实际存在的内容。

标签: c# arrays serialization


【解决方案1】:

您的 sizeof 调用可能不会返回您认为的内容,但如果您要坚持使用硬编码的输出偏移量,那么担心 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),你会得到一个例外。

【讨论】:

  • Marshal.SizeOf() 返回大小,包括对齐,这就是为什么它不仅仅是 mem1、mem2 和 mem3 的大小之和。 Array.CopyTo 考虑内存对齐?如果是这样,那么 temp 没有足够的空间来存储 AtData 权利
  • 如果我可以使用 sizeof 而不是硬编码值会更好
  • CopyTo 只是一个数组副本,它对对齐/填充一无所知。你知道接收端具体的对齐/填充要求是什么吗?
猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多