将 class 实例从字节数组编组到字节数组

Marshal class instance from and to byte array

我正在尝试使用这些方法将 class 实例从字节数组编组到字节数组:

编组到字节数组:

        public static byte[] MakeArrayFromCat(Cat cat)
        {
            var size = Marshal.SizeOf(typeof(Cat));
            var bytes = new byte[size];
            var ptr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(cat, ptr, false);
            Marshal.Copy(ptr, bytes, 0, size);
            Marshal.FreeHGlobal(ptr);
            return bytes;
        }

编组到 class 实例:

 public static Cat MakeCatFromArray(byte[] b)
        {
            var size = b.Length;
            var bytes = new byte[size];
            var ptr = Marshal.AllocHGlobal(size);
            Marshal.Copy(bytes, 0, ptr, size);
            var cat = (Cat)Marshal.PtrToStructure(ptr, typeof(Cat));
            Marshal.FreeHGlobal(ptr);
            return cat;
        }

这是我的 class:

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public class Cat
    {
        
        public string Name { get; set; }
        public int Weight { get; set; }
        public int Age { get; set; }

        public Cat (string name, int age, int weight)
        {
            Name = name;
            Age = age;
            Weight = weight;
        }
    }

因此,当我 运行 提供的方法时,程序会抛出 MissingMethodException,这意味着没有不接受争论的构造函数。我在这条线上得到它(在 MakeCatFromArray 方法中):

var cat = (Cat)Marshal.PtrToStructure(ptr, typeof(Cat));

我尝试添加一个默认构造函数,但我从中得到的结果并不符合我的预期:它给了我一个所有属性都为空的实例,尽管我编组了一个非-默认值。因此我有两个问题:

1.How 在这种情况下我可以正确编组吗? 2.Is 有什么更好的方法可以将 class 的实例转换为字节数组 而无需 将其标记为 [Serializable] ?

问题在于:

Marshal.Copy(bytes, 0, ptr, size);

您正在尝试从空字节数组创建 Cat。

应该有b而不是bytes:

Marshal.Copy(b, 0, ptr, size);