Marshal C#struct包含可变长度的struct数组(也在C#中定义)到字节数组

时间:2016-10-09 18:50:33

标签: c# serialization struct marshalling

这个问题有变种,但我找到的是"我在C DLL中有一个结构"。在这种情况下,我有100%的C#代码。我有一个结构,其中包含一个可变长度的结构数组,我试图编组到一个紧密压缩的字节数组。我使用了结构和Marshal.StructureToPtr,因为我需要一个紧密排列的数组,而不需要BinaryReader / Writer用来帮助它序列化和反序列化的所有元数据。

这是结构定义:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CharacterSelect_Struct
{
    public uint CharCount;
    public uint TotalChars;

    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct)]
    public CharacterSelectEntry_Struct[] Entries;

    public static CharacterSelect_Struct Initialize(uint totalChars, uint charCount)
    {
        return new CharacterSelect_Struct
        {
            CharCount = charCount,
            TotalChars = totalChars,
            Entries = 0 != charCount ? new CharacterSelectEntry_Struct[charCount] : null
        };
    }
}

如果Entries包含1个元素,则此方法很有用。如果它包含2个或更多,我仍然只获得第一个元素的内容。

有没有办法序列化上面的内容并获取条目的所有内容,或者我是否必须手动序列化上述内容,如果有,除了这样做,"单独序列化每个条目并附加到列表,然后序列化外部结构"?

我使用了struct和Marshal.StructureToPtr方法,因为它似乎比使用类和使用BitConverter手动编写所有序列化和反序列化更容易,但我想知道是否有更简单的方法给出我需要什么..

0 个答案:

没有答案