Datenformat
Das Datenformat DXN
DXN — Data eXchange Notation — ist ein Datenmodell in zwei Schreibweisen: .dxn, eine Textform zum Lesen und Bearbeiten, und .dxnb, eine Binärform auf CBOR-Basis. Beide tragen dieselben 28 Typen, von exakten Dezimalzahlen bis zu Mengen, Structs und Zeitstempeln, und lassen sich verlustfrei ineinander überführen.
Ein erster Blick
Ein DXN-Dokument ist ein einzelner Wert. Dieses hier ist eine Map, die den Großteil des Formats auf einmal nutzt:
@dxn "1.0"
%{
id: @uuid "550e8400-e29b-41d4-a716-446655440000"
name: "Ada Lovelace"
active: true
score: 19.99M
tags: @{:admin :staff}
meta: @ordered %{created: ~U[1990-01-01 00:00:00Z]}
address: %Point[51.05, 13.74]
result: {:ok, 200}
handle: ~r/^[a-z0-9_]{3,20}$/i
}@dxn "1.0"ist eine optionale Kopfzeile mit der Formatversion.%{…}ist eine Map;name:ist ein Keyword-Schlüssel. Kommas sind überall optional.19.99Mist eine exakte Dezimalzahl, keine Gleitkommazahl — der Typ für Geldbeträge.@{…}ist eine Menge,{…}ein Tupel,@ordered %{…}eine Map, deren Reihenfolge zu ihrem Wert gehört.%Point[…]ist ein Struct, nach Position geschrieben; ein Schema gibt seinen Feldern Namen und Typen.@uuid,~U[…]und~r/…/sind eine UUID, ein UTC-Zeitstempel und ein regulärer Ausdruck — Werte eigenen Typs, keine Zeichenketten.
Dasselbe Dokument als .dxnb braucht 215 statt 305 Bytes und wird wieder zu exakt demselben Wert dekodiert.
Gestaltung
- Ein Modell, zwei Kodierungen. Jeder Wert hat eine Text- und eine Binärform, und der Weg hin und zurück ist verlustfrei.
- Exakte Zahlen. Ganzzahlen haben beliebige Genauigkeit; Dezimalzahlen und Brüche sind exakt und bleiben es auch binär.
- Absicht in der Syntax. Ein Tupel ist keine Liste, eine geordnete Map keine Map, eine Menge keine Liste ohne Duplikate — der Unterschied steht im Dokument, statt nebenbei vereinbart zu werden.
- Robust bei Unbekanntem. Ein Struct oder Tag, das ein Leser nicht kennt, wird trotzdem gelesen — als undurchsichtiger Wert, den er unverändert weitergeben kann.
- Schemas in derselben Notation. Ein
.dxns-Schema ist ein DXN-Dokument; eine zweite Sprache gibt es nicht. - Vertraut für Elixir-Augen. Maps, Tupel, Keywords, Sigils und
?c-Zeichen sind so geschrieben, wie Elixir sie schreibt.
Eckdaten
| Eigenschaft | Wert |
|---|---|
| Endungen | .dxn Text, .dxnb binär, .dxns Schema |
| Textkodierung | UTF-8 |
| Textkopf | @dxn "1.0" — optional, nur als erste Form |
| Binär | DX, ein Versionsbyte, dann ein CBOR-Element (RFC 8949) — siehe Binärformat |
| Kommentare | # bis zum Zeilenende; nur im Text |
| Grammatik | PEG, geschrieben in Aether — siehe Grammatik |
Implementierungen
Diese Seiten beschreiben das Format. Die folgenden Bibliotheken lesen und schreiben es; ihre API steht jeweils in der eigenen Dokumentation.
| Name | Sprache | Rolle |
|---|---|---|
| dextrin | Elixir | Die Referenzimplementierung: Text, Binär und Schemas |
| node-dextrin | JavaScript | Dieselben Dokumente für Node.js |
| php-dextrin | PHP | Dieselben Dokumente für PHP |
| dextrin_html | Elixir | Wandelt zwischen HTML und DXN |
| ichor | Elixir | Der Grammatik-Compiler, der den Textparser von dextrin erzeugt |
Auf diesen Seiten
- Textformat — Dokumente, Trenner, Kommentare, Bezeichner, Tags und Verwerfen.
- Werte — alle 28 Typen und ihre Schreibweise.
- Binärformat — Umschlag, CBOR-Abbildung, private Tags und Wertteilung.
- Schemas —
.dxns-Dokumente: Typausdrücke, Struct-Schemas und Durchsetzung. - Grammatik — die formale Grammatik und wo die Referenzimplementierung noch davon abweicht.