C# 如何在HDF5 C上创建复合数据集#

C# 如何在HDF5 C上创建复合数据集#,c#,types,dataset,hdf5,C#,Types,Dataset,Hdf5,我需要将一些数据写入HDF5文件,在“BV”类中有一个类“OPC_UA”的对象列表,我想用BV的名称创建一个数据集,在数据集中我想有一个“OPC_UA”对象列表,OPC_UA类有3个属性,一个长int,一个浮点值和一个我将转换为时间戳的日期时间,我似乎不能让它工作,Marshal.SizeOf()不能与类一起工作,但我不能作为一个结构来工作。。。这是我的密码: public void CriaHDF5Customizado(PackingConfigFile pf) {

我需要将一些数据写入HDF5文件,在“BV”类中有一个类“OPC_UA”的对象列表,我想用BV的名称创建一个数据集,在数据集中我想有一个“OPC_UA”对象列表,OPC_UA类有3个属性,一个长int,一个浮点值和一个我将转换为时间戳的日期时间,我似乎不能让它工作,Marshal.SizeOf()不能与类一起工作,但我不能作为一个结构来工作。。。这是我的密码:

 public void CriaHDF5Customizado(PackingConfigFile pf)
    {
        H5FileId fileId = H5F.create("pmdfq.h5", H5F.CreateMode.ACC_TRUNC);

        H5GroupId infoGroupId = H5G.create(fileId, "informations");
        H5G.close(infoGroupId);
        H5GroupId datasetGroupId = H5G.create(fileId, "datasets");

        long[] dims = new long[1];


        foreach(BasicVariable bv in pf.basicVariableList.bvList)
        {
            OPC_UA aux = new OPC_UA();
            var xx = bv.bvData;
            int tamanho = Marshal.SizeOf(typeof(OPC_UA));
            dims[0] = (long)bv.bvData.Count;
            // dims[1] = (long)4;
            H5DataSpaceId spaceId = H5S.create(H5S.H5SClass.SCALAR);
            H5DataTypeId dataTypeId = H5T.create(H5T.CreateClass.COMPOUND, Marshal.SizeOf(typeof(OPC_UA)));

            H5T.insert(dataTypeId, "TimeStamp", 0, new H5DataTypeId(H5T.H5Type.NATIVE_UINT));
            H5T.insert(dataTypeId, "Quality", Marshal.SizeOf(H5T.H5Type.NATIVE_UINT), new H5DataTypeId(H5T.H5Type.NATIVE_UINT));
            H5T.insert(dataTypeId, "Value", 2* Marshal.SizeOf(H5T.H5Type.NATIVE_UINT), new H5DataTypeId(H5T.H5Type.NATIVE_INT));

            H5DataSetId dataSetId = H5D.create(datasetGroupId, bv.bvTag, dataTypeId, spaceId);


            //H5D.write(dataSetId, new H5DataTypeId(H5T.H5Type.STD_REF_OBJ), new H5Array<OPC_UA>(bv.bvData.ToArray()));
            H5D.writeScalar(dataSetId, dataTypeId, ref xx);
            H5D.close(dataSetId);
        }
        H5G.close(datasetGroupId);


        H5F.close(fileId);
    }
DateTime不是原子数据类型。将其转换为long/Int64刻度。那你就可以写了

public DateTime timeStamp 
    {
        get { return new DateTime(StartTimeTicks); }
        set
        {
            StartTimeTicks = value.Ticks;
        }
    }
public long StartTimeTicks;
构造器也可能会阻碍它

解决方法是制作一个结构。注意:根据要在反射中读取的(GetFields)字段或(GetProperties)属性,创建字段或属性的结构

 public structure OPC_UA
 {

    public string data;
    public Int64 quality ;
    public DateTime timeStamp 
    {
        get { return new DateTime(StartTimeTicks); }
        set
        {
            StartTimeTicks = value.Ticks;
        }
    }
    public long StartTimeTicks;
 }
是一个正在工作的C#包装器。您可以使用C#结构列表编写复合数据集

如果在使用Hdf.PInvoke或Hdf5DotnetTools的函数时遇到任何困难,可以使用其UnitTest项目

public DateTime timeStamp 
    {
        get { return new DateTime(StartTimeTicks); }
        set
        {
            StartTimeTicks = value.Ticks;
        }
    }
public long StartTimeTicks;
 public structure OPC_UA
 {

    public string data;
    public Int64 quality ;
    public DateTime timeStamp 
    {
        get { return new DateTime(StartTimeTicks); }
        set
        {
            StartTimeTicks = value.Ticks;
        }
    }
    public long StartTimeTicks;
 }