我正在使用 C# (.NET 5)。想象一下,我有一个存储结构数组(例如浮点数)的类:
public class StoresArray
{
private float[] floats;
}
Run Code Online (Sandbox Code Playgroud)
此类的数据是从序列化的二进制文件加载的。为了分配floats数组,我使用辅助函数从序列化文件中读取字节。重要的是,此函数然后尝试直接将加载的字节重新解释为而不是复制到新数组。float[]
public static class Deserializer
{
public static float[] Load(string file)
{
byte[] bytes = LoadBytesFromFile(file);
// This is a compiler error, of course.
return (float[])bytes;
}
}
Run Code Online (Sandbox Code Playgroud)
预期用途如下:
// Within the StoresArray class...
floats = Deserializer.Load("MyFile.file");
Run Code Online (Sandbox Code Playgroud)
这里值得注意的是,我试图将存储float[]为成员变量,而不仅仅是在byte[]本地迭代。因此,通过Span<T>( Span<float> floatSpan = MemoryMarshal.Cast<byte, float>(bytes.AsSpan())) 进行投射是不够的。Memory<T>与、Marshal、 和相关的功能MemoryMarshal也同样失败。当然,我可以使用跨度(以及其他方法,如或不安全的指针)从BitConverter …
我想将 Color[] 保存到文件中。为此,我发现使用“System.IO.File.WriteAllBytes”将字节数组保存到文件应该非常有效。
我想以一种安全的方式将我的 Color[](结构数组)转换为字节数组:
如果可能,最好有一种通用的方法将字节数组转换为任何结构(T 结构)数组,反之亦然。
如果不可能,为什么?
谢谢,埃里克
我认为这两个解决方案制作了一个我想避免的副本,而且它们都使用 Marshal.PtrToStructure 特定于结构而不是结构数组: