将结构转换为字节,保存到文件并由C#中的另一个应用程序读回结构

时间:2013-07-19 23:18:42

标签: c# struct bytearray marshalling

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

这是我的结构。它具有动态数量的“值”。如果值的数量为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写入字节,然后退出。 当我必须再次运行程序并读取我保存的文件。我使用BinaryReader。我从文件中获取每32个字节,并使用以下方法将每个32字节的数组转换回struct:

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

但是,PtrToStructure()发生SafeArrayTypeMismatchException。 谁能告诉我我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:0)

您是否意识到作为数组类型的double[]引用类型?该结构保存long,后跟对堆对象的引用。

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

我相信你应该简单地将数组的元素写入二进制编写器。