Warman nutzt kein JSON, XML, Protobuf oder irgendeine Drittanbieter-Serialisierungsbibliothek. Jedes Datenstueck, das auf die Festplatte geschrieben oder uebers Netzwerk gesendet wird, nutzt ein eigenes binaeres Format, aufgebaut auf C#s BinaryReader und BinaryWriter. Das umfasst Speicherdateien, Raumdaten, Terrain-Punkte, Netzwerk-Ticks, Item-Daten und Mod-Inhalte.
Das Interface
Das gesamte System basiert auf einem Interface: IBinarySerializable. Es hat zwei Methoden: WriteBytes(BinaryWriter) und ReadBytes(BinaryReader). Jedes Struct oder Klasse, das dieses Interface implementiert, kann in ein Byte-Array serialisiert und zurueckgelesen werden.
Erweiterungsmethoden
Die BinaryExtension-Klasse bietet Erweiterungsmethoden fuer Unity-Typen (Vector3, Quaternion, Bounds), Spiel-Enums (DamageType, EffectType, ItemRarity), Arrays, Listen, Nullable-Typen und Asset-Referenzen. Eine Vector3 schreiben sind drei Floats. Ein Enum schreiben ist ein einzelnes Byte.
Asset-Referenzen (wie Modifikatoren, Gegner-Presets und Raumdateien) werden nach Name serialisiert. Beim Schreiben wird der Name-String des Assets gespeichert. Beim Lesen wird der Name in einer globalen Asset-Registry nachgeschlagen. Das bedeutet, Speicherdateien und Netzwerk-Pakete enthalten String-Namen fuer Assets, keine binaeren Zeiger. Sie ueberleben Spiel-Updates, die Speicher-Layouts aendern.
Warum kein JSON?
Drei Gruende. Erstens Groesze: Ein PlayerInputCommand serialisiert zu etwa 7 Bytes in binaer. Dieselben Daten als JSON waeren 10-20x groeszer. Zweitens Geschwindigkeit: Binaeres Lesen/Schreiben sind direkte Speicheroperationen, kein Parsing noetig.
Versionierung
Der Kompromiss ist Versionierung. Binaere Formate brechen, wenn sich die Datenstruktur aendert. Warman loest das mit Versions-Bytes am Anfang kritischer Datenstrukturen. Ein TerrainPoint schreibt seine Version (derzeit 1) als erstes Byte. Der Reader prueft die Version und verzweigt zum korrekten Deserialisierungspfad.
Fuer Netzwerkdaten braucht man keine Versionierung. Alle Clients laufen dieselbe Spielversion, erzwungen beim Verbindungsaufbau. Fuer Speicherdateien und Mod-Inhalte ist sie wichtig, und der Versions-Byte-Ansatz haelt die Dinge rueckwaertskompatibel.