CSharp - 在 C# 中,将结构转换为字节,另存为文件,然后将它的读回另一个应用程序

  显示原文与译文双语对照的内容

我尝试将结构写入二进制文件,但无法正确读取。

这是我的结构。它有一个动态的"值"数。 如果值为 3,则 GetSize() 将返回 8 + ( 8 *3 ) = 32


[StructLayout (LayoutKind.Sequential)]
public struct Sample
{
 public long timestamp;
 public double[] values;

 public int GetSize()
 {
 return sizeof(long) + sizeof(double) * values.Length;
 }
}

首先,通过以下方式将结构转换为字节:


public static byte[] SampleToBytes(Sample samp)
{
 int size = samp.GetSize();
 byte[] arr = new byte[size];
 IntPtr ptr = Marshal.AllocHGlobal(size);
 Marshal.StructureToPtr(samp, ptr, true);
 Marshal.Copy(ptr, arr, 0, size);
 Marshal.FreeHGlobal(ptr);

 return arr;
}

然后,我使用BinaryWriter编写字节,然后退出。 当我必须再次运行程序并读取所保存的文件时。 在文件中,每个 32字节都会返回到结构,使用以下方法将每个字节转换为结构:


public static Sample BytesToSample(byte[] arr)
{
 Sample samp = new Sample();
 IntPtr ptr = Marshal.AllocHGlobal(32);
 Marshal.Copy(arr, 0, ptr, 32);
 samp = (Sample)Marshal.PtrToStructure(ptr, samp.GetType());
 Marshal.FreeHGlobal(ptr);

 return samp;
}

但是,SafeArrayTypeMismatchException发生在 PtrToStructure() 。 谁能告诉我什么是错误的?

谢谢。

时间:

你确实认识到,作为一种类型的double[] 是一个收费的引用类型 。 结构保存 long,后面跟随对堆对象的引用。

这就是为什么它不能工作的原因,我认为。

我相信你应该简单地把你的array 元素写到二进制编写器。

...