使用hdf5.net读取和编写引用类型

时间:2016-01-18 03:10:03

标签: c# hdf5

我正在使用HDF5DotNet编写通用数据记录API DataLog<T>。我们的想法是使用反射来自动创建一个H5复合数据类型,其中包含<T>中的字段。然后,用户可以使用T方法轻松地将数据添加到数据日志中。

为了自动创建H5类型,必须使用write(T[] data)[StructLayoutAttribute]的某些字段修饰类或结构。然后将每个字段映射到H5类型并添加到H5复合数据类型。包含枚举或其他用户定义结构的类型有点复杂,但它们仍然有效。

从我在网络上找到的示例中,我成功创建了H5类型,创建了一个数据集并为我创建的简单[MarshalAsAttribute]添加了一些数据。

当我将类型从struct更改为struct时,会出现问题。仍然创建了H5Type并且没有抛出异常,但是当我在HDF View中打开文件时,我可以看到正确的字段,但数据是垃圾。

我怀疑发生问题是因为在C#结构中是值类型而类是引用类型。我使用以下代码来确定数据的基础结构:

class

事实证明,无论我使用public static byte[] GetBytes(dynamic obj) { var size = Marshal.SizeOf(obj); // Both managed and unmanaged buffers required. var bytes = new byte[size]; var ptr = Marshal.AllocHGlobal(size); // Copy object byte-to-byte to unmanaged memory. Marshal.StructureToPtr(obj, ptr, false); // Copy data from unmanaged memory to managed buffer. Marshal.Copy(ptr, bytes, 0, size); // Release unmanaged memory. Marshal.FreeHGlobal(ptr); return bytes; } 还是class,字节数及其顺序都与此函数完全相同。

供参考(因为网上代码示例不多)我会提供附加到现有数据集的代码:

struct

我希望能够为此使用类,因为使用结构需要对应用程序的其余部分进行重大的结构更改。有谁知道为什么H5写作不适用于课程以及我可以解决的任何方式?

0 个答案:

没有答案