我正试图使用以下方法将类实例从字节数组封送到字节数组:
封送到字节数组:
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);