C# 在c语言中将类序列化为字节数组#

C# 在c语言中将类序列化为字节数组#,c#,arrays,serialization,C#,Arrays,Serialization,我正在为我的类编写自定义序列化程序,它应该将类对象序列化为字节数组。下面是我的示例代码: [StructLayout(LayoutKind.Sequential)] public class ATTRIBUTE_STR { public uint atType; public uint atLen; public byte[] atData = new byte[3]; public byte[] serialize() { byte[]

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

[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,但我想使用我的自定义序列化程序。

您的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),您将得到一个异常。

您的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.OffsetOf()
获得非托管内存中的结构偏移量。不,我只是指一个类。“我认为它没有正确地复制到字节数组中。”-你能解释一下你的实际问题吗?我在问题中对它进行了编辑。你将“不正确”改为“不正确”,这几乎没有什么帮助。显示您希望在数组中出现的内容以及实际出现的内容。您是想使用
struct
而不是
class
?你可以通过
Marshal.OffsetOf()
获得非托管内存中的结构偏移量。不,我只是指一个类。“我认为它没有正确地复制到字节数组中。”-你能解释一下你的实际问题吗?我在问题中对它进行了编辑。你将“不正确”改为“不正确”,这几乎没有什么帮助。显示您希望在数组中包含的内容以及实际包含的内容。Marshal.SizeOf()返回包含对齐的大小,这就是为什么它不只是mem1、mem2和mem3的大小之和。Array.CopyTo是mem对齐的帐户吗?如果是这样的话,那么temp就没有足够的空间来存储数据了。如果我可以使用sizeof而不是硬编码的值,那就更好了。pyto只是一个数组副本,它不知道对齐/填充。您知道接收端的特定对齐/填充要求是什么吗?Marshal.SizeOf()返回包括对齐的大小,这就是为什么它不只是mem1、mem2和mem3的大小之和。Array.CopyTo是mem对齐的帐户吗?如果是这样的话,那么temp就没有足够的空间来存储数据了。如果我可以使用sizeof而不是硬编码的值,那就更好了。pyto只是一个数组副本,它不知道对齐/填充。您知道接收端的具体对齐/填充要求是什么吗?