将 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);
我正在尝试使用这些方法将 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);