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

我正在使用HDF5DotNet编写通用数据记录API, DataLog 。 我们的想法是使用reflection来自动创建包含T字段的H5复合数据类型。 然后,用户可以使用write(T[] data)方法轻松地将数据添加到数据日志中。

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

从我在网上找到的例子中,我成功地创建了H5 Type,创建了一个数据集并为我创建的简单struct添加了一些数据。

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

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

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

事实certificate,无论我是使用class还是struct ,字节数及其顺序都与此函数完全相同。

作为参考(因为网上没有很多代码示例),我将提供我的代码以附加到现有数据集:

 public static void AppendToDataSet(H5DataSetId dataSetId, DataType[] data) { if (data.Length < 1) { return; } var dataSpaceId = H5D.getSpace(dataSetId); var rank = H5S.getSimpleExtentNDims(dataSpaceId); var dims = H5S.getSimpleExtentDims(dataSpaceId); var rank_chunk = new long[] { }; var prop = H5D.getCreatePropertyList(dataSetId); if (H5P.getLayout(prop) == H5D.Layout.CHUNKED) { rank_chunk = H5P.getChunk(prop, rank); } var dims_extended = new long[] { dims[0] + data.Length }; // the new data set size /* Extend the dataset */ H5D.setExtent(dataSetId, dims_extended); /* Select a hyperslab in extended portion of dataset */ H5S.selectHyperslab(dataSpaceId, H5S.SelectOperator.SET, new long[] { dims[0] }, new long[] { data.Length }); /* Define memory space */ var memspace = H5S.create_simple(rank, dims_extended); /* Convert to HDF data */ var hdf_data = new H5Array(data); /* Write the data to the extended portion of dataset */ var dataTypeId = H5D.getType(dataSetId); H5D.write(dataSetId, dataTypeId, hdf_data); } 

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