Referenztypen mit hdf5.net lesen und schreiben

9

Ich verwende HDF5DotNet , um eine generische Datenprotokollierungs-API zu schreiben, DataLog<T> . Die Idee besteht darin, mithilfe der Reflektion automatisch einen zusammengesetzten H5-Datentyp zu erstellen, der die Felder in T enthält. Der Benutzer kann dann einfach Daten mit einer write(T[] data) -Methode zum Datenprotokoll hinzufügen.

Um die H5-Typen automatisch zu erstellen, muss die Klasse oder Struktur mit [StructLayoutAttribute] und einigen Feldern mit [MarshalAsAttribute] versehen werden. Jedes Feld wird dann einem H5-Typ zugeordnet und zum zusammengesetzten H5-Datentyp hinzugefügt. Typen, die Enumerationen oder andere benutzerdefinierte Strukturen enthalten, sind etwas komplizierter, funktionieren aber immer noch.

Anhand von Beispielen, die ich im Internet gefunden habe, habe ich erfolgreich den H5-Typ erstellt, ein Dataset erstellt und einige Daten für ein einfaches struct hinzugefügt, das ich erstellt habe.

Mein Problem tritt auf, wenn ich den Typ von struct zu class ändere. Der H5Type wird immer noch erstellt und es werden keine Ausnahmen ausgelöst, aber wenn ich die Datei in der HDF-Ansicht öffne, kann ich sehen die richtigen Felder, aber die Daten sind Müll.

Ich vermute, dass das Problem auftritt, da in C # -Strukturen Werttypen und Klassen Referenztypen sind. Ich habe den folgenden Code verwendet, um festzustellen, wie die zugrunde liegende Struktur der Daten aussah:

%Vor%

Es hat sich herausgestellt, dass es egal ist, ob ich ein class oder ein struct verwende, die Anzahl der Bytes und deren Reihenfolge kommen genau aus dieser Funktion heraus.

Als Referenz (und weil es nicht viele Codebeispiele im Web gibt) stelle ich meinen Code bereit, um ihn an einen vorhandenen Datensatz anzuhängen:

%Vor%

Ich würde gerne Klassen dafür verwenden können, weil die Verwendung von Strukturen größere strukturelle Änderungen für den Rest der Anwendung erfordern würde. Weiß jemand, warum das H5-Schreiben nicht für Klassen funktioniert und wie ich es beheben kann?

    
Matt Williams 18.01.2016, 03:10
quelle

0 Antworten

Tags und Links