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

Mat*_*ams 9 c# hdf5

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

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

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

当我从一个类型更改时我的问题structclass.仍然创建了H5Type并且没有抛出异常,但是当我在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;
}
Run Code Online (Sandbox Code Playgroud)

事实证明,无论我使用a class还是a struct,字节数和它们的顺序都与此函数完全相同.

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

public static void AppendToDataSet<DataType>(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<DataType>(data);

    /* Write the data to the extended portion of dataset  */
    var dataTypeId = H5D.getType(dataSetId);

    H5D.write(dataSetId,
        dataTypeId,
        hdf_data);

}
Run Code Online (Sandbox Code Playgroud)

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