将类实例从字节数组封送至字节数组



我正试图使用以下方法将类实例从字节数组封送到字节数组:

封送到字节数组:

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;
}

Marshal到类实例:

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;
}

这是我的课:

[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.在这种情况下,如何正确编组?2.有没有更好的方法可以将类的实例转换为字节数组而不将其标记为[Serializable]

问题在于:

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

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

应该有b而不是bytes:

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

最新更新